快速排序,本博客供自己学习记录使用,也欢迎大家一起讨论。
介绍比较好的网站:快速排序算法 (biancheng.net)
里面有一些动图,我的代码也是借鉴他的。
快速排序的思想:假设数组nums长度为n,从数组中随机抽选择一个数,一般是最后一个数位置n-1,使用左指针left=0,右指针right=n-2,左指针往右走,遇到比nums[n-1]大的数停止,右指针往左走,遇到比nums[n-1]小的数停止,如果此时左指针小于右指针,则交换两指针处的值,并将左右指针推进一个,否则跳出循环,最后交换nums[left]和nums[n-1],
此时,nums[n-1]左边值均比他小,右边的值均比他大,但是此时左右两边是无序的,需要再递归进行排序左右部分,这里有个小技巧,如果题目中要求的是第K大的数,则当left==n-k时可以直接返回这个数,如果left<n-k,则可以只递归【left+1,right],可以省去绝大部分时间。
#include<bits/stdc++.h>
using namespace std;
class quicksort
{
public:
void quick_sort(vector<int>&nums,int left,int right)
{
if (left >= right) return;
int cur = onesort(nums, left, right);
quick_sort(nums, left, cur - 1);
quick_sort(nums, cur + 1, right);
}
int onesort(vector<int>&nums, int left, int right)
{
int begin = left;
int end = right - 1;
int rightnum = nums[right];
while (1)
{
while (begin<=right&&nums[begin] < rightnum)
++begin;
while (end>=0&&nums[end] > rightnum)
--end;
if (begin >= end) break;
swap(nums[begin], nums[end]);
++begin;
--end;
}
swap(nums[begin], nums[right]);
return begin;
}
};
int main()
{
vector<int> nums{ 4,3,5,1,7,6 };
quicksort qs;
int n = nums.size();
qs.quick_sort(nums, 0, n-1);
for (int num : nums)
cout << num << " ";
cout << endl;
return 0;
}