算法基础No.1,浅谈快速排序分治思想

一,核心思想

思想是一种分治思路,选定一个基准值,目的是将比这个值小的值排在左边,比他大的值排在右边,第一次排的时候应该不会排完,所以会用到递归,我们所说的分治思想就要体现出来,即将一个大块内容分为无数个小内容,每个小内容函数执行代码相似,小内容解决后,返回回去大内容。

二,代码实现

void sortt(int arr[], int l, int r) {//l和r代表数组最左个下标值和最右个下标值
	if (l >= r)
		return;
	int jz = arr[l]; int i = l; int j = r;
	while (i < j) { 
		while (arr[i] < jz)
		    i++;
		while (arr[j] > jz)
			j--;
		if (i < j)
			swap(arr[i], arr[j]);
	}
	sortt(arr, l, j);//1号递归处
	sortt(arr, j+1, r);//2号递归处
}

思路:分为左右两个指针,左指针遇到的数小于基准值就通过,大于就停下,此时右指针开始移动,与左指针执行情况相反,这样就保证了我左指针左边一定是小于基准值的数,右指针则相反。while代码段里面就实现了一次,小于基准值在左边,大于基准值在右边。

递归分治过程

首先我们可以看到,l和j是左序列,j+1到r是右序列,首先开始第一步递归,将左边数组,即小于基准值的放一边,重复刚才操作,再次抵达一号递归处。如果仍有未排好序的数组,则按第一次递归前那样分成左右数组。

递归需要有终止条件否则一直递归计算机会崩掉。因此当i和j碰一起甚至i跑到了j右边时候,说明此段序列已经排好了序或者这段序列只有一个值,可以开始返回了。

返回的时候是重点,递归每次相当于开了一次函数,当到达最后一级时候会向上一级先返回一次,返回后数据会达到上一次递归的数据(打个比方,我排序100,25,125,150,50,175六个数据,第一次按基准值分数组时分成25,50以及100,125,150,175,当25和50左边数组排好序后,返回后,数组变成25,50,100,125,150,175,只不过一号递归函数没了,开始执行一号递归函数下面的所有代码,也就是右边数组的值进行排列),对右边排列后,当右边序列开始return时候,由于二号递归函数下面已经没有代码,因此快速返回直接将排好的右序列和左序列一同合并。递归结束。

这样做法也练就了多个递归函数怎么看的问题

下一个博客页我会在拿个题讲一下分值算法。现在五点了干不动了,赞同的点个赞呗,不同意的欢迎各位dalao们留言

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值