快速排序分治函数过程总结
来源:互联网 发布:印度 巴基斯坦 知乎 编辑:程序博客网 时间:2024/06/02 06:53
假设我们已经知道快速排序的算法框架时,我们已经可以从宏观地去掌握快速排序算法的思想。但是快速排序算法的关键还是在于划分操纵,同时快速排序的性能主要取决于划分操作的好坏。快速排序分治partition过程有两种方法:
1)两个下标分别从首、尾向中间扫描的方法
2)两个指针索引一前一后逐步向后扫描的方法
因为我常用第一种,因此,我拿第一种来进行分析,就以下这段代码分析:
1 int Partition(ElemType R[],int low,int high) 2 { 3 ElemType pivot = R[low];//保存枢轴 4 while(low<high) 5 { 6 while(low<high&&R[high]>=pivot)//从右边寻找小于枢轴的值 7 --high; 8 R[low]=R[high]; 9 while(low<high&&R[low]<=pivot)//从左边寻找大于枢轴的值10 ++low;11 R[high]=R[low];12 }13 A[low]=pivot;//基准记录已被最后定位14 return low;//return high也是可以15 }
每次调用一次快速排序,都要进行划分。而每次划分时候,在划分函数中将发生以下事情:
1、从传进函数的数组中,取一个数作为枢轴(假设是low下标指向的元素),同时声明一个变量来保存枢轴,我们可以认为我们已经从数组中抽掉一个元素。此时,数组中low位置认为为空。这就给下面的循环创造条件。
对应函数中的语句:
ElemType pivot = R[low];//保存枢轴
2、这是一个循环体(循环(1)与(2)),直到不满足low<high跳出:
(1)因为我们假设枢轴元素为low,那么首次就先从high开始向前面扫描,寻找一个小于枢轴 pivot 的元素。当找到的时候,将high指向的元素调到low处空位子,此时high的位置视为空位子。
while(low<high&&R[high]>=pivot)//从右边寻找小于枢轴的值 --high; R[low]=R[high];//填补low位上的空缺
(2)然后,从左向右扫描,寻找大于枢轴 pivot的元素。当找到时候,将low指向的元素调到(1)留下的空位high。此时low处为空。
while(low<high&&R[low]<=pivot)//从左边寻找大于枢轴的值 ++low; R[high]=R[low];//填充high处空缺
3、当上述循环结束后,原来程序试图填补那个空缺最后还是没填上,有一种捉襟见肘的感觉。而这个时候,在中间的那个空位置,左边的数全部小于右边的数。这个空位子理所当然就是枢轴所属,因此完成了一次划分,枢轴元素在本次划分中排在了自己最终的位置上。
4、此时,high与low都指向pivot位置,因此返回给快排函数,最为快排算法中递归调用的新的边界。
A[low]=pivot;//基准记录已被最后定位 return low;//return high也是可以
还有,我们在划分的过程中,所有与枢轴相同的元素不会移动。
第二种方法有待总结。
- 快速排序分治函数过程总结
- 分治策略----快速排序
- 分治法--快速排序
- 分治法--快速排序
- 分治法-快速排序
- 分治法-快速排序
- 分治法-----快速排序
- 分治算法-快速排序
- 分治法 --快速排序
- 分治算法----快速排序
- 分治法-快速排序
- 快速排序-分治算法
- 分治---快速排序
- 分治算法---快速排序
- 分治法--快速排序
- 快速排序 分治法
- 快速排序(分治)
- 分治算法 快速排序
- linux内核链表回顾-(2)
- 关于Eclipse 和 IDEA 导入library库文件 的步骤
- 高级搜索指令
- 分页问题学习及一些小结
- 多态polymorphic 内存图的小小示例
- 快速排序分治函数过程总结
- Android Studio使用疑难问题汇总
- 旋转数组的最小数字
- IOS基础UI之(七)综合小案例-猜图
- POJ1837
- 在windows上安装php扩展
- NYOJ——463 九九乘法表
- 剑指offer第二十题【包含min函数的栈】c++实现
- MyBatis SqlSessionFactory的几种常见创建方式