#include <vector>
#include <iostream>
using namespace std;
// partition实现
int partition(vector<int>& nums, int left, int right)
{
// 当数组只有一个元素时直接返回该元素index
if (left == right)
return left;
// 简单地取第一个数作为pivot
int pivot = nums[left];
int lp = left + 1, rp = right;
while (lp < rp)
{
//找到左起第一个>pivot的数
while (nums[lp] <= pivot && lp < rp)
++lp;
//找到右起第一个<=pivot的数
while (nums[rp] > pivot&& lp < rp)
--rp;
// 如果lp = rp 直接跳出循环
if (lp == rp)
break;
// 互换nums[lp] 和 nums[rp]
swap(nums[lp], nums[rp]);
++lp;
--rp;
}
if (nums[lp] <= pivot)
{
// 如果nums[lp] <= pivot
// 令nums[left] = nums[lp]
// 并将pivot放到nums[lp]中
swap(nums[left], nums[lp]);
return lp;
}
else
{
// 否则令nums[left] = nums[lp-1]
// 并将pivot放到nums[lp-1]中
swap(nums[left], nums[lp - 1]);
return lp - 1;
}
}
//对nums数组的[left, right]区间进行排序
void qsort(vector<int>& nums, int left, int right)
{
if (left >= right)
return;
// 返回pivot index
// pivot前面的数均<=pivot
// pivot后面的数均>pivot
int idx = partition(nums, left, right);
// 对左边部分调用qsort
qsort(nums, left, idx - 1);
// 对右边部分调用qsort
qsort(nums, idx + 1, right);
}
int main()
{
vector<int> nums{ 5,3,2,4,1};
qsort(nums, 0, nums.size() - 1);
for (int num : nums)
cout << num << " ";
cout << endl;
}