用c实现花样排序算法(5)——快速排序(挖坑)

本文介绍了一种名为“挖坑”的排序算法,通过挖坑填坑的过程实现数据排序。该算法利用递归方式,每次确定一个元素的位置,最终完成整个数组的排序。与直接选择排序相比,“挖坑”算法在遍历次数上有明显优势。

目录

1.“挖坑”算法的思想

2.“挖坑”的实现

 3.总结


1.“挖坑”算法的思想

“挖坑”的意思和字面上一样就是将一个数挖出来,再由另一个数把它填上。而为了达成排序的目的,我们可以有规律的将不同的数依次挖出,从而达成排序。

例如:

 图中紫色部分数据可以看做key,每次挖坑的目标便是将key放在一个特殊位置上。保证key前面的数据都小于key,key后面的数据都大于key。通过这样操作,不难发现key就到了排序时的位置。

2.“挖坑”的实现

A.先简单阐述一下实现过程:

将第一个数先看成key,且挖一个坑pivot。定义一个begin和end,第一步:end向前找一个比key小的,填上坑并将找到的位置变成新的pivot。第二步:begin向后找一个比key大的,填上坑并将找到的位置变成新的pivot。最后循环这两步就可以排出一个key的位置了。排序就是重复上诉整个过程n次。

B.康康代码和结果吧(涉及递归):

void QuickSort(int* arr, int left, int right)
{
	if (left >= right)//递归的结束条件
		return;
	int begin = left; int end = right;
	int pivot = begin;//将第一个位置作为坑
	int key = arr[begin];
	while (begin < end)
	{
		//从后面往前找一个小于key的值
		while (arr[end]>=key&&begin < end)//因为end和begin下面会进行++ --操作,所以要多一次判断。
			end--;
		arr[pivot] = arr[end];//将坑用第一个小于key的值“埋上”
		pivot = end;//找到新的坑
		//同理,从前往后找一个大于key的值
		while (arr[begin] <= key&&begin < end)
			begin++;
		arr[pivot] = arr[begin];
		pivot = begin;
	}
	//循环结束表示begin与end相遇,找到了适合key的“坑”
	pivot = begin;
	arr[pivot] = key;//“埋坑”第一次调整结束

	//递归,将数组分为坑的左边与坑的右边
	QuickSort(arr, left, pivot - 1);
	QuickSort(arr, pivot + 1, right);
}
int main()
{
	int arr[] = { 8, 5, 6, 9, 4, 2, 3, 1 };
	int len = sizeof(arr) / sizeof(arr[0]);
	QuickSort(arr, 0, len - 1);
	Print(arr,len);
	return 0;
}

 3.总结

对比直接选择排序:

 用c实现花样排序算法(4)——直接选择排序_不会敲代码的运气选手^的博客-优快云博客

“挖坑”每次遍历次数更少,更为快捷。

评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会敲代码的运气选手^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值