【数据结构】八大排序之快速排序以及优化

一、思想

1、基于分治策略

核心:选择基准点,将比基准点小的数放在基准点左边,比基准点大的数放在基准点右边。

2、分析思想

如何选择基准点??
首先我们选择第一个数据为基准点放在变量 key 中,那么0号位置就暂时成为无效位。但是并不是每次都选择第一个数据,举例:
在这里插入图片描述
从上述我们可以发现
(1)如果从左往右比较,小数不移动,就继续按顺序++,如果从右往左比较,大数不移动,继续按倒叙- -
(2)如果移动,遵循的是大数在后,小数在前的规律,移动到前面或者后面无效的位置。
(3)此时key = 15,已经排序完成,所以就把整个数据分成了两个部分,现在我们先对前半部分进行同样方法的排序操作。
在这里插入图片描述
在这里插入图片描述
(4)其中每次的key保存的不一定是0号元素,应该说基准点key保存每次可排列分组的第一个数据
(5)我们发现分组数据小于或等于1时,也就是一个或没有数据时,我们不进行排列,认为他有序或者无效

3、小结论

以基准点的位置将数据分为两部分,然后再将小数放在左边,大数放在右边进行快速排序处理,不断的又找基准点,又排序,又分组,这样的思想可以通过递归来处理。

4、借助代码理解

(1)给出基准点 key ,key并不一定从0号位置开始,可以认为是从每个可排序的小组中的第一个元素。
(2)start 标记小组的起始位置;end标记小组的末尾位置
所以key = arr[ start ];//小组的起始为基准点
(3)当倒序处理后面的数据时
arr[ end ] >= key时,不移动数据,end--
arr[ end ] < key时,arr[ start ] = arr[ end ];//小数放在前面
(4)当顺序处理前面的数据时
arr[ start ] <= key时,不移动数据,start++
arr[ start ] > key时,arr[ end ] = arr[ start ];//大数放在后面
(5)当 start = end时,表示找到了基准点的位置,最后将基准点数据放在位置上即可。

二、完整代码实现

#include<stdio.h>

int parition(int arr[], int start, int end)//找到基准点后的基准点下标
{
	int boundkey = arr[start];
	while (start < end)//元素没有遍历完,如果start<=end表示所有数据比较完成
	{
		while (start < end && arr[end] >= boundkey)//元素没有遍历完并且大数就在后面,不用移动
			end--;
		arr[start] = arr[end];//后面有数据比基准值小
		while (start < end && arr[start] <= boundkey)//元素没有遍历完并且小数就在前面,不用移动
			start++; 
		arr[end] = arr[start];
	}
	arr[end] = boundkey;
	return start;//此时start = end
}
void Quick(int arr[], int start, int end)//控制区间
{
	int key;
	if (start < end)//判断这个区间是否需要排序
	{
		key = parition(arr,start,end);//在start和end找到基准点
		Quick(arr,start, key - 1);//递归调用把基准点左边划分成一个区间
		Quick(arr,key + 1, end);//递归调用把基准点右边划分成一个区间
	}
}
void QuickSort(int arr[], int len)//拿到数据和数组大小,在主函数中被调用
{
	Quick(arr, 0, len - 1);
}
int main()
{
	int arr[] = { 12, 3, 21, 32, 1, 34, 12, 35, 34 };
	int len = sizeof(arr) / sizeof(arr[0]);
	for (int i = 0; i < len; i++)
	{
		printf("%d  ", arr[i]);
	}
	printf("\n");
	QuickSort(arr, len);
	for (int i = 0; i < len; i++)
	{
		printf("%d  ", arr[i]);
	}
	printf("\n");
	return 0;
}

三、快排的优化???

1、当数据基本有序时

如果数据基本有序时,快排会一步一步找基准点进行递归遍历,这时递归层次达到了最大,效率最低,对于这种情况,我们怎么优化??

2、当数据是随机的

如果数据是随机的,又该如何处理?

3、如果是小数据量

当数据量过小时,调用递归会使效率降低,杀鸡焉用牛刀?此时该如何处理。

4、数据中多个重复数据

当重复数据过多时,用我们学到的代码会一次又一次对相同的数据进行递归排序,这样会导致程序开销大,效率低,该如何处理??

5、函数调用递归,开销大

递归调用会使程序开销大,能不能用一种不是用递归的方式进行快速排序???
欲知后事如何,请听下回分解…
快排的五个优化

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
邀请码:a54ed48fee85400295d14c9e6def970b “奇奇SEO优化”钱柜软件是米图团队经过对搜素引擎算法多年跟踪研究,采用全新的智能云优化技术,开发出来的一款搜索引擎关键词优化工具:奇奇SEO优化软件。奇奇SEO优化软件能迅速在百度、谷歌、搜狗、搜搜、雅虎、有道、必应等搜索引擎中,依次进行目标网站的搜索,大幅度提高搜索引擎对网站的注重程度和关注度,提高网站在搜索引擎中的权重值。提高搜索引擎收录频率和收录量;提高网站访问量和关键字位置排名,迅速将优化的关键词显示在底层相关搜索,同样可以智能优化搜索引擎搜索下拉框,快速占领最火爆最抢眼的十个搜索下拉位置。我们坚信:必定成为网站必备工具! 奇奇SEO优化软件亮点 ●点击逼真。和真人点击一样,众多挂机者自动点击,分布式点击,挂机环境各不相同,点击逼真、真实,效果看得见! ●支持所有主流搜索引擎。挂机时会看到,全面、功能强大! ●支持点击地区设置。有针对性点击,和搜索引擎中的设置对应,针对性强,避免空点,提高效率! ●清空浏览痕迹、cookies、清除浏览缓存,点击有效 ●目标网页随机停留数秒后自动关闭 ●目标网页随机位置、随机二次点击、深入点击,将真实演绎到底! ●免费。挂机有积分即可免费使用,无资金担忧。 ●批量删除、批量更新、批量启用、批量停止 简单易操作 您可以用第一名点击器,来做这些事情 ●点击各类搜索引擎的竞价广告 ●点击关键词在搜索引擎结果中的自己的网站,提高关键词搜索排名 ●提高网站排名、提高关键词搜索指数、百度指数 ●刷百度下拉框、刷相关搜索 ●点击淘宝直通车竞价广告 ●点击阿里网销宝竞价广告任何你想象和在最新软件版本功能基础上,你可能用到第一名点击器。上述提及的搜索引擎,囊括了百度、谷歌、搜搜、搜狗、必应、有道、淘宝直通车、阿里网销宝等所有常见的搜素引擎,并且在以后使用中,视网友使用频率建议会不断增加,比如单百度点击,我们就已经包括了百度网页、百度图片、百度知道等搜索类型的点击,第一名点击器功能之强大,真正拿出时间好好用过的人,最有体会!当然,众多的功能,对绝大多数网友可能只使用了冰山一角,更多的潜在的用武之地,待你挖掘和琢磨! 奇奇SEO优化软件特点 1、简单易用 使用简单,操作方便,自动升级,针对个人网站永久免费。 2、高度安全 基于沙盒原理,有效拦截各类病毒木马下载程序,自动、收集过滤恶意网址。 3、真实有效 基于智能云优化技术,利用网络节点地域差异性,用户随机性,使访问效果真实有效 4、优化原理及手法 通过反馈网站权重数据包给搜索引擎,合理的分配网站的权重,提升网站的关注度和友好度,从而达到网站关键字排名迅速提升的效果。 5、完全兼容虚拟机运行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值