思路
递归,双指针
每次迭代将一个基数的左侧元素都<基数,右侧元素都>基数
递归函数:
1.创建基数,创建start、end和left、right双指针
循环直到left>=right
2.从末尾找第一个比基数小的元素作为right指针,再从首位找第一个比基数大的元素作为left指针
3.swap(left,right)
4.swap(基数,left)
5.基数左侧进行递归(start, left)
6.基数右侧递归函数(left+1, end)
复杂度
时间:O(nlog(n))
空间:O(1)
代码(C++)
void swap(std::vector<int>& src, int left, int right)
{
int temp = src[left];
src[left] = src[right];
src[right] = temp;
return;
}
void quickSortLoop(std::vector<int>& src, int start, int end)
{
// 递归函数 跳出条件
if (start >= end) return;
int left = start;
int right = end;
int cur = left;
while (left < right)
{
// 1. 注意为<=,防止两个相同数值元素重复调换
// 2. 注意left<right
while (src[cur] <= src[right] && left<right)
{
right--;
}
while (src[left] <= src[cur] && left < right)
{
left++;
}
swap(src, left, right);
}
swap(src, cur, left);
quickSortLoop(src, start, left);
quickSortLoop(src, left + 1, end);
return;
}
void quickSort(std::vector<int>& src)
{
if (src.size() <= 1) return;
quickSortLoop(src, 0, src.size() - 1);
return;
}