快速排序笔记
2016-01-24 10:20
253 查看
背景:给直角坐标系下的坐标(x,y)组合排序,用到此,特记之。
最坏时间复杂度:n2n^2,平均时间复杂度:nlgnn \lg n
参考:/article/1347607.html
最坏时间复杂度:n2n^2,平均时间复杂度:nlgnn \lg n
#include<vector> #include<iostream> using namespace std; /** *基于分治思想。 *初始化慢者,比快者慢一步,中枢是最后一个数; *慢者始终指向快者最近邻的比中枢小的值,倾向于往前一步是大值, * 快者用于找寻第一个比中枢小的值,倾向于往后 一步是大值; * 找到后,更新慢者加1,并交换慢者与快者的值, * 最后 慢者加1与中枢交换。 * @brief partition * @param vi * @param low * @param up * @return */ int partition(vector<int> &vi, int low, int up){ int pivot = vi[up]; int i = low-1;//这个慢者必须设定为比最小索引j小1,否则两个元素的序列,比如2,1无法交换 for (int j = low; j < up; j++) { if(vi[j] <= pivot) { i++;//移动慢者 swap(vi[i], vi[j]); } } swap(vi[i+1], vi[up]); return i+1; } //C++'s array range should be [low, up], the same as [low, up+1) void quickSort(vector<int> &vi, int low, int up){ if(low < up){ int mid = partition(vi, low, up); //Watch out! The mid position is on the place, so we don't need to consider it again. //That's why below is mid-1, not mid! Otherwise it will occur overflow error!!! quickSort(vi, low, mid-1); quickSort(vi, mid+1, up); } } void qSort(vector<int> &vi){ quickSort(vi, 0, vi.size()-1); } int main(){ int a[] = {3,5,7,9,2,3,1,0,7,5,4}; vector<int> va(a, a+11); cout<<"Before quicksort:\n"; for(auto x:va) cout<<x<<" "; cout<<endl; qSort(va); cout<<"After quicksort:\n"; for(auto x:va) cout<<x<<" "; cout<<endl; system("pause"); return 0; }
参考:/article/1347607.html
相关文章推荐
- MAC COCOA call command 调用终端控制台程序
- 在JDK源码中搜索设计模式的例子
- android之本地文件读取
- 手动备份升级WordPress
- 判断任意两台计算机的IP地址是否属于同一子网络的两种地址转换方法
- 【Groovy手札】Groovy的List
- POJ 2485(最小生成树)
- python ftplib模块编写简单的ftp服务
- 无偏估计与自由度
- java基础学习笔记
- Springmvc(5)之多部件表单、json交互和拦截器
- 分享js document.all的用法
- Java SimpleDateFormat parse 遭遇unparsable date异常
- 求方差时为什么要除以N—1,而不是除以N!【通俗理解-非数学专业】
- APUE_内存管理
- rspec 单元测试问题
- spark 命令行环境 python
- 企业项目化管理【一】:项目管理软件选型指南
- 详解PHP对象的串行化与反串行化
- 数组