理解快速排序

理解快速排序

1.对快速排序的理解

快排运用了分治的思想

举个例子说明分治

假设省长要给xx全省修路,省长把各市长叫过来说你去修路吧。修路的范围是我们省

然后市长又跟县长说,你们去修路吧 修路的范围是我们市

……

最后无数农民工,他们再想向下吩咐的时候一看,哦豁,我就是最底层,把自己面前的路修好吧。

2.快排步骤

假设对区间 left 到 right 进行划分

(1).把区间最左边作为标兵,两个指针从两端开始向中间相向而行

​ 右指针遇到比标兵小的,和左指针遇到的比标兵大的交换

注意!!右指针先动,这样可以保证相遇时,相遇的位置的值小于标兵值

(2).相遇后的位置,位置左边的数都小于标兵的值,位置右边的数都大于标兵的值,位置上的值也小于标兵的值

因此,交换标兵和当前位置的值

(3)假设界限的下标为 j 左右两边继续划分操作

左边的区间变成 left和 j-1

右边的区间变成 j+1 和 right

3.分析代码

//交换操作,这就不多说了
void Swap(int arr[],int i,int j)
{
    int temp=arr[i];
    arr[i]=arr[j];
    arr[j]=temp;
}

int qsort(int arr[],int left,int right)
{
	if(left>=right)		 //当left==right时,说明当前区间只有一个值,该干的干完了,不用往下了
		return 0;
	int num=arr[left];	 //标兵的值
	int i=left;			//左移动指针
	int j=right;		//右移动指针
	while(i<j)			//左右指针相碰时,划分操作结束,而相遇时的位置就是下一次划分的界限
	{
        //重点!右边先开始扫
		while(arr[j]>=num&&j>i)	j--;	//从右边扫找到第一个小于标兵的点
		while(arr[i]<=num&&i<j)	i++;	//从左边扫找到第一个大于标兵的点
		Swap(arr,i,j);				   //交换他们
	} 
	Swap(arr,left,j);		//两指针相遇后,就找到了下一次划分的界限,把找到的分界线上的值和标兵换一下
	qsort(arr,left,j-1);	//分界线左边继续划分
	qsort(arr,j+1,right);	//分界线右边继续划分
}

没找到合适的画图软件,而且画图丑的很,所以还是有点抽象,如果配上图就好多了,等我考完研就来改进。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值