1. 原理
首先, 在一个待排序序列中, 以第一个元素为基准, 让序列中所有的基准小的元素在该元素左边, 比其大的元素在其右边. 算法是一种原地算法, 首先把序列里面从基准开始的下一个元素一直到序列尾, 分成左右部分, 左边的都是小的, 右边的都是大的, 最后把基准跟中点交换一下, 再递归对左右部分进行同样的方法排序, 直到所有有序. 那么怎么实现基准后的元素左小右大呢, 可以用双指针的方法.
2. 算法实现
2.1 递归实现
void quikSort(vector<int>& nums, int start, int end) {
if (start >= end)
return;
int mark = nums[start];
int left = start + 1;
int right = end;
while (left < right) {
if (nums[left] <= mark) {
left ++;
continue;
}
if (nums[right] >= mark) {
right --;
continue;
}
swap(nums[left], nums[right]);
}
if (nums[left] > mark)
left --;
swap(nums[start], nums[left]);
quikSort(nums, start, left - 1);
quikSort(nums, left + 1, end);
}
vector<int> sortArray(vector<int>& nums) {
int n = nums.size();
quikSort(nums, 0, n - 1);
return nums;
}
2.2 迭代实现
vector<int> sortArray(vector<int>& nums) {
int n = nums.size();
if (n < 2)
return nums;
queue<pair<int, int>> sort_q;
sort_q.push(make_pair(0, n - 1));
while (!sort_q.empty()) {
int start = sort_q.front().first;
int end = sort_q.front().second;
sort_q.pop();
int left = start + 1;
int right = end;
while (left < right) {
if (nums[left] < nums[start])
left ++;
else if (nums[right] > nums[start])
right --;
else {
swap(nums[left], nums[right]);
}
}
if (nums[left] > nums[start])
left --;
swap(nums[start], nums[left]);
if (left - 1 > start)
sort_q.push(make_pair(start, left - 1));
if (left + 1 < end)
sort_q.push(make_pair(left + 1, end));
}
return nums;
}