快速排序的枢轴(pivot)和边界
2013-02-28 20:16
148 查看
最近在看算法导论中的快速排序的算法,
算法的基本思想是选择数组中的一个元素x作为枢轴,然后与数组中的其它元素进行比较,
通过一趟排序使枢轴左边比x小,枢轴右边比x大,然后再递归的进行下去。
lz想,既然随便选一个元素当枢轴,就抱着试验的心理将枢轴从a[r]改为a[p]。但是结果不对。
再回头仔细看一下算法,发现当用不同的元素作为枢轴的时候,相应的边界条件要做出改变。
下面分别给出以 a[p]和a[r]作为枢轴时的代码,做个对照。下一步实现随机快速排序,请高手指教
以a[p]为枢轴时:
以a[r]作为枢轴时:
算法的基本思想是选择数组中的一个元素x作为枢轴,然后与数组中的其它元素进行比较,
通过一趟排序使枢轴左边比x小,枢轴右边比x大,然后再递归的进行下去。
lz想,既然随便选一个元素当枢轴,就抱着试验的心理将枢轴从a[r]改为a[p]。但是结果不对。
再回头仔细看一下算法,发现当用不同的元素作为枢轴的时候,相应的边界条件要做出改变。
下面分别给出以 a[p]和a[r]作为枢轴时的代码,做个对照。下一步实现随机快速排序,请高手指教
以a[p]为枢轴时:
#include<iostream> using namespace std; int partition(int a[],int p,int r) { int x = a[p]; int i =r+1,j=0; int tmp = 0; for(j= r; j >=p+1;j--) { if(a[j] >= x) { i--; tmp = a[i]; a[i] = a[j]; a[j] = tmp; } } tmp = a[p]; a[p] = a[i-1]; a[i-1] = tmp; return i-1; } void quickSort(int a[],int p,int r) { if(p < r) { int q = partition(a,p,r); quickSort(a,p,q-1); quickSort(a,q+1,r); } } int main() { int a[10]={20,-2,1,9,5,21,46,30,96,17}; quickSort(a,0,9); for(int i = 0;i <10;++i) cout<<a[i]<<endl; return 0; }
以a[r]作为枢轴时:
#include<iostream> using namespace std; int partition(int a[],int p,int r) { int x = a[r]; int i =p-1,j=0; int tmp = 0; for(j= p; j <=r-1;j++) { if(a[j] <= x) { i++; tmp = a[i]; a[i] = a[j]; a[j] = tmp; } } tmp = a[r]; a[r] = a[i+1]; a[i+1] = tmp; return i+1; } void quickSort(int a[],int p,int r) { if(p < r) { int q = partition(a,p,r); quickSort(a,p,q-1); quickSort(a,q+1,r); } } int main() { int a[10]={20,-2,1,9,5,21,46,30,96,17}; quickSort(a,0,9); for(int i = 0;i <10;++i) cout<<a[i]<<endl; return 0; }
相关文章推荐
- DualPivotQuicksort两枢轴快速排序
- DualPivotQuickSort 双轴快速排序 源码
- 读书笔记 算法导论 快速排序 QuickSort 使用最后一个元素作为pivot
- 快速排序-常见中轴(主元pivot)选择方法及实现代码(末位/随机/三数中值/..)
- 快速排序 之添加复合插入排序和原始序列取中值左pivot
- Java DualPivotQuickSort 双轴快速排序 源码 笔记
- 数据结构之浅析快速排序
- 快速排序——java实现
- 《啊哈!算法》读书笔记--排序(快速排序,冒泡排序)
- 快速排序,归并排序,堆排序的java代码实现
- JAVA数组快速排序
- 快速排序
- 算法学习之三:快速排序
- 快速排序 C语言的qsort 以及 C++的 sort
- 快速排序示例
- 排序算法之--快速排序
- 【快速排序、合并排序与分治思想】
- java---快速排序
- 快速排序的C++实现
- c#-快速排序-算法