快排
基于分治法的交换排序
特征
- 每次排序之后对于第k位置来说,位于[0,k-1]的数都小于它,位于[k+1,n-1]的数都大于它
- 最好情况下,递归深度形成一颗完全二叉树的空间复杂的O(log2n),最坏情况下形成只有左子树或者只有右子树,复杂度O(n),递归的平均复杂度O(log2n),快排是交换排序,交换的复杂度O(n),所以快排的平均复杂度O(nlog2n)
步骤
1.建立交换函数swap()
将待排序列的第一位元素设置成哨兵pos,设置两个寻找标记指针,第一个标记从后往前找,
寻找比哨兵小的元素,找到之后与哨兵交换位置,第二个标记再从前往后找比哨兵大的元素,
找到之后与哨兵交换位置。直到两个指针交会即可停止,并返回该位置。
2.建立分治函数quickSort()
将swap函数返回的位置作为中间值mid,对[left,mid-1],[mid+1,right]区间继续进行分治,
直到left和right相等为为止。
模板
int swap(vector<int> &v,int l,int r)
{
int pos = v[l];
while (l<r)
{
while (l < r&&v[r] >= pos) r--;
v[l] = v[r];
while (l < r&&v[l] <= pos) l++;
v[r] = v[l];
}
v[l] = pos;
return l;
}
void quickSort(vector<int> &v, int l,int r)
{
if (l >= r) return;
int mid = swap(v,l,r);
quickSort(v, l, mid - 1);
quickSort(v, mid + 1, r);
}