一.总体思想
快速排序总体的思想是取一个中间轴(pivot),将小于pivot的数移动到其左边,将大于pivot的数移动到其右边,然后再次对左边小于pivot的数重复操作,也就是随便找一个中心轴,然后将小于中心轴的数移动到左边,大于中心轴的数移动到右边,反复操作直到中心轴左边只有一位数字。
时间复杂度:O(nlogn)
二.具体操作
分别设置左右指针(left,right),当然不是真的指针,只是两个左右移动的下标,left从数组的最左边开始,right从数组的最右边开始,pivot是数组中随机的一个数,一般选取最左边的那个数,如果基准的pivot在最左边,那么就要从右边的right开始向左检索,这一点非常重要,因为如果从左开始检索的话,最左边的数也就是pivot<=pivot,那么,满足条件就会left指针右移,这样新的数组就会出现两个pivot(一会提到pivot的最终位置就清楚了),好了说清楚怎么移动之后,当left和right移动到同一个位置的时候移动停止,也就是中间位置,此时这个位置的数要么小于pivot要么大于pivot也就是说它一定会被移动到左边或者是右边,那么这个位置就是还未被赋值的,所以将pivot赋值到中间位置(前面提到的两个pivot就是这里一个,最左边一个),然后对pivot左边的数重复此操作,对pivot右边的数重复此操作(递归)。
三.代码
void quickSort(vector<int>&nums,int L,int R)
{
if(L>=R) //递归结束条件:L>=R也就是pivot左边只有一位数字,一位数字可以被理解成已经排好序了
return;
int left=L;
int right=R;
int pivot=nums[left];
while(left<right)//左右指针相等的时候循环终止
{
while(left<right&&nums[right]>=pivot)//一定要右指针开始出动
{
--right;
}
if(left<right)//上一个while循环结束的功劳是找到了nums[right]<pivot的数
{
nums[left]=nums[right];//现在将它赋值给左边
}
while(left<right&&nums[left]<=pivot)
{
++left;
}
if(left<right)上一个while循环结束的功劳是找到了nums[right]>pivot的数
{
nums[right]=nums[left];//现在将它赋值给右边边
}
if(left>=right)
{
nums[left]=pivot;//左右指针到一个位置
}
}
quickSort(nums,L,right-1);//递归再次重复操作
quickSort(nums,right+1,R);//递归再次重复操作
}