算法——快速排序
思路:选择一个基点,小的放基点左边,大的放基点右边。
快排不是稳定的排序。平均时间复杂度为O(n*logn),最坏的时候为(n^2)
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
template <typename T>
int getPoint(vector<T>& v,int start,int end){
T point = v[start];
while(start < end){
while(start < end && v[end] >= point){
end--;
}
swap(v[start],v[end]);
while(start < end && v[start] <= point)
start++;
swap(v[start],v[end]);
}
return start;
}
template <typename T>
void Qsort(vector<T>& v,int start,int end){
while(start < end){
int point = getPoint(v,start,end);
Qsort(v,start,point-1);
start = point+1;
}
}
int main(){
vector<double> v {9,1,45,674,3,666.66,0,99,666,45,78,666,52,5};
Qsort(v,0,v.size()-1);
for(auto x : v)
cout << x << " ";
cout << endl;
return 0;
}
快排的优化:
- 3选一(选个中位数)让随机性更加大;
- 小的数组排序选择插入排序(小于等于7,7是插入排序效率最高的分界点)
- 尾递归