总结:
这里自己总是忘记,所有再次在这里手敲一遍
整体思路,找一个flag,大于等于的放右边边,小于等于的放左边,然后递归左边,递归右边。
- 注意递归结束条件 left >= right
- 注意while的循环条件,left < right 这里是因为有很多组数,需要交换
- 注意 if 的作用 一次while循环中,两个if执行一次,因此本质是交换下标为 first end的数
- 最后注意 arr[first] = flag (此时first对应的数已经给了end, 也就是first这一位是多余的,因为一开始就把他的值取出来了,后面借用了他的位置。 因此,最后要将first的值设置为flag)
#include <vector>
#include <iostream>
using namespace std;
void quicksort(vector<int>& arr, int left, int right)
{
if(left >= right)
return;
int first = left;
int end = right;
int flag = arr[left]; // 取第一个值为标记数
while(first < end )
{
// 从后往前 大于等于的在右边
// 小于等于在左边
// 注意 交换 fisrt end值 一次while 只交换一次
// 最后要把first的值放回去(此时first的值已经被end取走了)
while(first < end && arr[end] >= flag)
end--;
if(first < end)
{
arr[first++] = arr[end];
}
while(first < end && arr[first] <= flag)
first++;
if(first < end)
{
arr[end--] = arr[first];
}
}
arr[first] = flag;
quicksort(arr, left, first - 1);
quicksort(arr, first + 1, right);
}
int main()
{
vector<int> arr = {1,2,3,5,4,8,5,7,6,9};
quicksort(arr, 0, arr.size() - 1);
for(auto p:arr)
{
cout<<" "<<p;
// 1 2 3 4 5 5 6 7 8 9
}
}