编程珠玑之快速排序
来源:互联网 发布:天勤网络 编辑:程序博客网 时间:2024/06/02 06:24
我们将需要划分的目标区间定位[l, u]。
首先给定目标值t = x[l]。我们需要重新组织x[l...u],使得所有小于t的元素都在m的一端,所有大于t的元素在m的另一端。
初始时m = l,我们将i从l+1一直遍历到u,代码在检测第i个元素时必须考虑两种情况。如果x[i]>=t,那么一切正常,不变式为真;如果x[i]<t,可以通过使m增加1(指向小元素的新位置)重新获得不变式,然后交换x[i]和x[m]。
首先给定目标值t = x[l]。我们需要重新组织x[l...u],使得所有小于t的元素都在m的一端,所有大于t的元素在m的另一端。
初始时m = l,我们将i从l+1一直遍历到u,代码在检测第i个元素时必须考虑两种情况。如果x[i]>=t,那么一切正常,不变式为真;如果x[i]<t,可以通过使m增加1(指向小元素的新位置)重新获得不变式,然后交换x[i]和x[m]。
void q_sort_ori(int *a, int low, int high){if (low < high){int m = low;for(int i = low + 1; i <= high; i++){int tmp = a[i];if(tmp < a[low]){swap(a[++m],a[i]);}}swap(a[m],a[low]);for(int i = 0; i <= 7; i++)cout<<a[i]<<" ";cout<<endl;q_sort_ori(a,low,m-1);q_sort_ori(a,m+1,high);}}
下标i和j初始化为待划分数组的两端。主循环中有两个内循环,第一个内循环将i向右移过小元素,遇到大元素时停止;第二个内循环将j向左移过大元素,遇到小元素时停止。然后主循环测试这两个下标是否交叉并交换它们的值。这样做虽然交换的次数增加了,但却将所有元素都相同的最坏情况变成了差不多需要nlog2n次比较的最好情况
void qsort2(int *a, int low, int high) { if (low < high) { int i = low + 1; int j = high; int tmp = a[low]; while (i <= j) { while (i <= high && a[i] < tmp) { i++; } while (a[j] > tmp) { j--; } if (i <= j) { swap(a[i], a[j]); } } swap(a[low], a[j]); for(int i = 0; i <= 7; i++)cout<<a[i]<<" ";cout<<endl; qsort2(a, low, j - 1); qsort2(a, j + 1, high); }}
测试代码
int main(){int a[] = {55,41,59,26,53,58,97,93};qsort2(a,0,7);for(int i = 0; i <= 7; i++)cout<<a[i]<<" ";}
阅读全文
0 0
- 编程珠玑之快速排序
- [编程珠玑读书笔记]快速排序
- 快速排序优化算法 - 编程珠玑
- 快速排序(编程珠玑C++版)
- 编程珠玑——快速排序总结
- 编程珠玑----快速排序的变形
- 编程珠玑11章——快速排序的改进
- [编程珠玑]-第十一章:快速排序及第k小元素
- 编程珠玑: 电话号码排序
- 编程珠玑笔记--排序
- 【编程珠玑】位图排序
- 位图排序-《编程珠玑》
- 插入排序--《编程珠玑》
- 【编程珠玑】第十一章 排序 (插入排序和快速排序的深度优化)
- 编程珠玑(2)第一章学习之位图排序
- 编程珠玑第11章--应用之排序
- 编程珠玑之scaffolding
- [编程珠玑读书笔记]最好的快速排序与库函数中的排序函数比较
- 欢迎使用CSDN-markdown编辑器
- 最全面的Java多线程用法解析
- java基础知识.1
- Choreographer: Skipped 129 frames! The application may be doing too much work on its main thread.
- 如何应对网站反爬虫策略?如何高效地爬大量数据?
- 编程珠玑之快速排序
- 约瑟夫环—华为试题
- 关于ES、PES、PS以及TS码流
- ZOJ 3329 One Person Game(概率DP,求期望)
- Python中sorted函数的用法
- 微信公众号授权及多公众号配置
- activiti 表相关
- Android_动态加载Fragment
- FaceBoxes —— CPU上实时的人脸检测