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

一.总体思想

快速排序总体的思想是取一个中间轴(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&nums,int L,int R)
{
	if(L>=R) //递归结束条件:L>=R也就是pivot左边只有一位数字,一位数字可以被理解成已经排好序了
	return;
    int left=L;
    int right=R;
    int pivot=nums[left];
    while(left=pivot)//一定要右指针开始出动 
        {
            --right;
        }
        if(leftpivot的数
        {
            nums[right]=nums[left];//现在将它赋值给右边边
        }
        if(left>=right)
        {
            nums[left]=pivot;//左右指针到一个位置
        }
    }
    quickSort(nums,L,right-1);//递归再次重复操作
    quickSort(nums,right+1,R);//递归再次重复操作
}

你可能感兴趣的:(排序算法,算法)