我是靠谱客的博主 幽默电话,最近开发中收集的这篇文章主要介绍用c实现花样排序算法(5)——快速排序(挖坑)1.“挖坑”算法的思想2.“挖坑”的实现 3.总结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

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)——直接选择排序_不会敲代码的运气选手^的博客-CSDN博客

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

最后

以上就是幽默电话为你收集整理的用c实现花样排序算法(5)——快速排序(挖坑)1.“挖坑”算法的思想2.“挖坑”的实现 3.总结的全部内容,希望文章能够帮你解决用c实现花样排序算法(5)——快速排序(挖坑)1.“挖坑”算法的思想2.“挖坑”的实现 3.总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部