在最近的学习中,对于排序算法进行了一定的学习,在这里对快速排序和选择排序的部分内容进行说明,其余内容在后期会进行补充,感谢大家提出宝贵意见。
宏定义如下:
<strong><span style="font-size:18px;">#include <iostream> using namespace std; #define M 21 typedef int SqList[M];</span></strong>
<strong><span style="font-size:18px;">void BubbleSort(SqList &L,int n) //冒泡排序 { for(int i = 0;i < n;++i) //外层循环记录循环次数 { for(int j = 0;j < n-i-1;++j) //内层循环记录每一次循环比较的次数 { //(j<n-i-1)比较一次后,其后值不参与再比较 if(L[j] > L[j+1]) //若前者大于后者,则交换位置 { int tmp = L[j]; L[j] = L[j+1]; L[j+1] = tmp; } } } }</span></strong>
<strong><span style="font-size:18px;">//改进方式,直接赋值 int Partition(SqList &L,int low,int high) //返回枢轴所在位置,它之前的小于它 { //之后的大于它 int key = L[low]; //枢轴记录关键字 while(low < high) //判别条件,不满足时结束 { while(low < high && L[high] >= key ) //若右边的大于枢轴 { high--; //向前比较 } L[low] = L[high]; //否则赋值 while(low < high && L[low] <= key) //若左边的小于枢轴 { low++; //向后比较 } L[high] = L[low]; //否则赋值 } L[low] = key; //此时low = high,即可等价为L[high] = key,枢轴记录到位 return low; //返回此时位置 } //交换方式 /*int Partition(SqList &L,int low,int high) { int key = L[low]; while(low < high) { while(low < high && L[high] >= key ) { high--; } int tmp = L[low]; L[low] = L[high]; L[high] = tmp; while(low < high && L[low] <= key) { low++; } tmp = L[low]; L[low] = L[high]; L[high] = tmp; } return low; }*/ void QuickSort(SqList &L,int low,int high) //快速排序 { if(low < high) { int prvitloc = Partition(L,low,high); //将数组一分为二 QuickSort(L,low,prvitloc-1); //左半部分排序 QuickSort(L,prvitloc+1,high); //右半部分排序 } }</span></strong>
<strong><span style="font-size:18px;">int SelectMinKey(SqList &L,int n,int key) //选择第key小的记录下标 { for(int k = key+1;k < n;++k) //只比较key之后的 { if(L[k] < L[key]) //若小于则记录下标 { key = k; } } return key; //返回下标 } void SelectSort(SqList &L,int n) //简单选择排序 { for(int i = 0;i < n-1;++i) { int j = SelectMinKey(L,n,i); //第key小的记录位置 if(i != j) //若不为此位置数,则交换位置 { int tmp = L[i]; L[i] = L[j]; L[j] = tmp; } } }</span></strong>
如下附上完整版函数和测试代码:
<strong><span style="font-size:18px;">#include <iostream> using namespace std; #define M 21 typedef int SqList[M]; void BubbleSort(SqList &L,int n) //冒泡排序 { for(int i = 0;i < n;++i) //外层循环记录循环次数 { for(int j = 0;j < n-i-1;++j) //内层循环记录每一次循环比较的次数 { //(j<n-i-1)比较一次后,其后值不参与再比较 if(L[j] > L[j+1]) //若前者大于后者,则交换位置 { int tmp = L[j]; L[j] = L[j+1]; L[j+1] = tmp; } } } } //改进方式,直接赋值 int Partition(SqList &L,int low,int high) //返回枢轴所在位置,它之前的小于它 { //之后的大于它 int key = L[low]; //枢轴记录关键字 while(low < high) //判别条件,不满足时结束 { while(low < high && L[high] >= key ) //若右边的大于枢轴 { high--; //向前比较 } L[low] = L[high]; //否则赋值 while(low < high && L[low] <= key) //若左边的小于枢轴 { low++; //向后比较 } L[high] = L[low]; //否则赋值 } L[low] = key; //此时low = high,即可等价为L[high] = key,枢轴记录到位 return low; //返回此时位置 } //交换方式 /*int Partition(SqList &L,int low,int high) { int key = L[low]; while(low < high) { while(low < high && L[high] >= key ) { high--; } int tmp = L[low]; L[low] = L[high]; L[high] = tmp; while(low < high && L[low] <= key) { low++; } tmp = L[low]; L[low] = L[high]; L[high] = tmp; } return low; }*/ void QuickSort(SqList &L,int low,int high) //快速排序 { if(low < high) { int prvitloc = Partition(L,low,high); //将数组一分为二 QuickSort(L,low,prvitloc-1); //左半部分排序 QuickSort(L,prvitloc+1,high); //右半部分排序 } } int SelectMinKey(SqList &L,int n,int key) //选择第key小的记录下标 { for(int k = key+1;k < n;++k) //只比较key之后的 { if(L[k] < L[key]) //若小于则记录下标 { key = k; } } return key; //返回下标 } void SelectSort(SqList &L,int n) //简单选择排序 { for(int i = 0;i < n-1;++i) { int j = SelectMinKey(L,n,i); //第key小的记录位置 if(i != j) //若不为此位置数,则交换位置 { int tmp = L[i]; L[i] = L[j]; L[j] = tmp; } } } void main() { SqList sq2 = {53,24,35,56,32,78,99}; for(int i = 0;i < 7; ++i) //打印sq2 { cout<<sq2[i]<<" "; } cout<<endl; BubbleSort(sq2,7); //冒泡排序结果打印 for(i = 0;i < 7; ++i) { cout<<sq2[i]<<" "; } cout<<endl; QuickSort(sq2,0,6); //快速排序 for(i = 0;i < 7; ++i) { cout<<sq2[i]<<" "; } cout<<endl; SelectSort(sq2,7); //简单选择排序 for(i = 0;i < 7; ++i) { cout<<sq2[i]<<" "; } cout<<endl; }</span></strong>
原文地址:http://blog.csdn.net/qaz3171210/article/details/46527083