十大排序之快速排序详解(附代码)

一.总体思想

快速排序总体的思想是取一个中间轴(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);//递归再次重复操作
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值