参考自:【每日算法】C语言8大经典排序算法(1)
1、算法思想
上面的内容刚开始我也不是全部懂,就知道它每一趟的目的是把小于关键数据的数据都排到它的左边(对于升序排序而言),大于关键数据的数据都排到关键数据的右边。但3)4)5)步看不太明白,不知道它到底是怎么实现的,我现在将我如何理解明白的方法分享一下。
2、核心代码
void quickSort(int *data, int low, int high) { if (data == NULL || low >= high) { return; } int pivotLoc; pivotLoc = partition(data, low, high); if (pivotLoc == -1) cout << "Wrong input" << endl; quickSort(data, low, pivotLoc - 1); quickSort(data, pivotLoc + 1, high); } int partition(int *data, int low, int high) { if (data == NULL || low >= high) { return -1; } int keyData = data[low]; while (low<high) { while ((low < high) && (data[high] >= keyData)) high--; data[low] = data[high]; while ((low < high) && (data[low] <= keyData)) low++; data[high] = data[low]; } data[low] = keyData; return low; }
还有值得一提的是,一趟结束后,关键数据就处在了应该在的正确位置。
比如
7,6,1,4,5,9,10,2
按这样的原则,关键数据就是7,一次运算后变成了
2,6,1,4,5,7,10,9
左边都是小于7的,右边都是大于7的,且排在第6位,而这组排列最终排好的顺序的结果应该是
1,2,4,5,6,7,9,10
7就是排在第6位,也就是说,快速排序的每一趟,都让关键数据排在了正确的位置
可能你光看我这走一遍还一思半解的,我当初也是,自己跑第一遍的时候还是模模糊糊的,但自己用笔在纸上像这样再跑了两遍后,就体会到了这算法的妙处了。这个算法非常巧妙,就这样看着实现了要完成的功能,可你如果要我为了实现这个功能,来自己设计出这个算法啊?那我也青史留名了。。所以我们只需要学习,然后记住天才们想出的算法,以后会用就足够了。
那么partition这个函数就搞定了。我已经授之以渔了,至于quickSort函数,简而言之就是对关键数据的左边和右边再重复做partition(递归哟),直到最终顺序都顺了就结束,相信你自己跑一遍肯定也很快会弄懂了。
3、Test程序
#include<iostream> #include<string> using namespace std; void quickSort(int *data, int low, int high); int partition(int *data, int low, int high); void main(void) { int array[10] = {9,8,7,6,5,4,3,2,1,0}; int num = 10; //step1: 遍历数组,输出初始排列 for (int arN = 0; arN < num; arN++) { cout << array[arN]<<' '; } cout << endl; //step2: 快速排序 quickSort(array, 0, num-1); //step3: 遍历数组,输出排序后结果 for (int arN = 0; arN < num; arN++) { cout << array[arN]<<' '; } } void quickSort(int *data, int low, int high) { if (data == NULL || low >= high) { return; } int pivotLoc; pivotLoc = partition(data, low, high); if (pivotLoc == -1) cout << "Wrong input" << endl; quickSort(data, low, pivotLoc - 1); quickSort(data, pivotLoc + 1, high); } int partition(int *data, int low, int high) { if (data == NULL || low >= high) { return -1; } int keyData = data[low]; while (low<high) { while ((low < high) && (data[high] >= keyData)) high--; data[low] = data[high]; while ((low < high) && (data[low] <= keyData)) low++; data[high] = data[low]; } data[low] = keyData; return low; }
欢迎评论交流,觉得好就顶个吧,写了老半天了不容易啊。。