自己写了一下快排的代码...于此记录
代码及其注释如下:
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
void swap(vector<int>&v,int i,int j) {
int temp = v[i];
v[i] = v[j];
v[j] = temp;
}
void quicklysort(vector<int>&v,int start,int end) {//快速排序
if (start < end) {
int base=v[start];//定下基值
int low = start;//这里叫低指针好了(设置一个变量来充当指针的作用)
int heigh =end+1;//那这里叫高指针吧
while (true) {
while (low < end && v[++low] <= base);//从左往右找到数组中第一个比base大的值为止
while (heigh > start && v[--heigh] >= base);//从右往左找到数组中第一个比base小的值为止
if (low < heigh) {
swap(v, low, heigh);//交换
}
else break;
}
swap(v, start, heigh);//确定了base最后所在的位置
quicklysort(v,start,heigh-1);//分而治之的思想进行递归调用,不断的确定每个base排序后最后的所在位置
quicklysort(v,heigh+1,end);
}
}
int main() {
vector<int>p = {1,2,3,4,5,4,8,5,9,10};
quicklysort(p, 0, p.size() - 1);
for (auto i : p) {
cout << i<<" ";
}
return 0;
}
结果:
1 2 3 4 4 5 5 8 9 10
关于快排的优化:感觉可以从每次递归时通过什么方式找到基值的方面入手,我们知道快排时间复杂度最差为O(n2),最好为O(nlogn)。而复杂度为O(n2)时,就是每次找到的基值都是最差的情况即要从左找到右。可以使用二分的思想来寻找基值,使得每次寻找的基值更趋向于好的情况。