快速排序
采用了分治法。
和归并排序正好互补:归并排序是将有序的子序列不断归并;快排是将序列不断分割,当子序列有序时,整个序列也有序。
Tips:
- 平均时间复杂度为:O(nlgn),最差为O(n^2);
- 快速排序的最好情况是每次都能正好能将数组半分;
- 最差情况是每次分割只能分成1个和另外的;
// 每一次Partition都是在寻找基准pivot的合适分割位置
int Partition(vector<int> &A, int begin, int end){
int pivot = A[begin];
while(begin < end){
// 因为pivot取的A[begin],故右边先走,覆盖掉A[begin]也没关系
while(begin < end && A[end] >= pivot) --end;
A[begin] = A[end];
while(begin < end && A[begin] <= pivot) ++begin;
A[end] = A[begin];
}
// 此时,跳出while后,begin==end,同时指向着pivot应该待的分割位置
A[begin] = pivot;
return begin;
}
void quik_sort(vector<int> &A, int begin, int end){
// stop condition: 当区间长度只有0or1时,停止
if(begin >= end)
return;
int pos = Partition(A, begin, end);
// 递归调用
quik_sort(A, begin, pos-1);
quik_sort(A, pos+1, end);
}