快速排序(挖坑法)

上一篇的内容中,已经介绍过快速排序中的一种霍尔划分的算法,这篇我们来看看第二种快速排序的划分方法——挖坑法

挖坑法划分

例如还是上一篇文章中的无序数列,我们依旧是选择一个基准值,仍然通过begin和end指针来操作
在这里插入图片描述
首先,我们仍然是从end开始向前找一个小于28的数,找到后直接放在begin的位置,注意这里不是交换,如下图
在这里插入图片描述
箭头所指向的是我们选取的基准值,这时可以理解为它不在这个数列当中,而end对应的位置就出现了一个坑,这时,begin开始向后寻找,找到第一个大于基准值的数后放到end的位置,如下图
在这里插入图片描述
此时,begin的位置又会出现一个坑,这时再次让end向前移动继续找第一个小于基准值的数,放到begin的位置,再使begin向后移动找第一个大于基准值的数,重复此操作直到begin和end相遇,这时,把基准值放到该位置。这样,一趟快速排序结束,如下图
在这里插入图片描述
此时,28的前面都是小于它的数,其后面都是大于它的数,则28的位置确定,只需要递归进行快排后,就会变成一个有序数列
代码如下

//挖坑法划分
int partion(int* array,int begin,int end)//待排序的数组起始地址,及首尾下标
{
	int key = array[begin];//选取第一个数为基准值
	while(begin<end)//循环条件
	{
		while(begin<end&&array[end] >= key)//从后向前找第一个小于基准值的数
			end--;
		array[begin] = array[end];//放到begin位置
		while(begin<end&&array[begin] <= key)//从前向后找第一个大于基准值的数
			begin++;
		array[end] = array[begin];放到end的位置
	}
	//此时跳出循环,则begin和end相遇
	array[begin] = key;//将基准值放入该位置
	return begin;//返回当前基准值的位置,以便递归划分
}

挖坑法划分完成后,我们也是写一个递归调用函数,和上一篇的调用一样,这里便不多说

void quicksort(int* array,int begin,int end)
{
	if(begin >= end)
		return ;
	int keypos = partion(array,begin,end);
	quicksort(array,begin,keypos - 1);
	quicksort(array,keypos + 1,end);
}

这里,第二种划分方法也介绍给大家了,大家可以下去试着写一写哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值