您的位置:首页 > 其它

快速排序笔记

2016-01-24 10:20 253 查看
背景:给直角坐标系下的坐标(x,y)组合排序,用到此,特记之。

最坏时间复杂度: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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: