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;
}