快速排序到底有多快

这篇具有很好参考价值的文章主要介绍了快速排序到底有多快。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

作者主页:paper jie的博客_CSDN博客-C语言,算法详解领域博主

本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。

本文录入于《算法详解》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造,将算法基础知识一网打尽,希望可以帮到读者们哦。

其他专栏:《系统解析C语言》《C语言》《C语言-语法篇》

内容分享:本期将对八大排序中的快速排序进行详细的讲解,各位看官姥爷快搬好小板凳坐好叭。

    -------- 不要998,不要98,只要一键三连,三连买不了吃亏,买不了上当

前言

在之前的排序中,我们对交换排序中的冒泡排序进行了讲解,带学习的过程中,我们发现一个问题,冒泡排序的速度实在是太慢了,它是两个两个元素进行比较。那有没有比这种排序更快的算法呢?当然是有的,就是今天我们讲的快速排序。

什么是快速排序

快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。快速排序是对冒泡排序的一种改进,大大的提升了排序的速度。

快速排序的实现

基本思想

定义一个中心轴pivot

将小于pivot的元素放在左边

将大于pivot的元素放在右边

将子数组用递归重复上面三步骤

具体代码

#include <stdio.h>

void Quick_Sort(int arr[], int l, int r)
{
	//如果就子数组就一个元素了,那它本身就是有序的
	//直接返回
	if (l >= r)
		return;
	int left = l;
	int right = r;
	//设置最左边的为基准轴
	int pivot = arr[left];

	while (left < right)
	{
		//从右边开始比较
		//大于pivot,right就--再比较前一个元素
		while (left < right && arr[right] > pivot)
		{
			right--;
		}
		//要是小于基准轴就将它放到left指向的元素
		//因为这个元素已经比pivot小了,left++跳过它
		if (left < right)
		{
			arr[left] = arr[right];
			left++;
		}
		//再从左边开始比较
		//小于pivot,left就++
		while (left < right && arr[left] < pivot)
		{
			left++;
		}
		//要是大于pivot,就将它放到right指向的元素
		//再right--,因为这个元素已经知道大于pivot了
		if (left < right)
		{
			arr[right] = arr[left];
			right--;
		}
		//当两个指针重合时,将pivot放入其中
		//这时比它小的都在左边,比他大的都在右边
		if (left >= right)
		{
			arr[left] = pivot;
		}
	}
	//递归处理左边的子数组
	Quick_Sort(arr, l, right - 1);
	//递归处理右边的子数组
	Quick_Sort(arr, right + 1, r);

}
int main()
{
	int arr[] = { 3,2,5,8,7,1,4,6,0,9 };
	int l = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	int r = sz - 1;
	//快速排序
	Quick_Sort(arr, l, r);
	//打印
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

快速排序实现的原理

排序算法的思想非常简单,在排序的数列中,我们首先要找一个数字作为基准数为了方便,我们一般选择第 1 个数字作为基准数。接下来我们需要把这个待排序的数列中小于基准数的元素移动到待排序的数列的左边,把大于基准数的元素移动到待排序的数列的右边。这时,左右两个分区的元素就相对有序了;接着把两个分区的元素分别按照上面两种方法继续对每个分区找出基准数,然后移动,直到各个分区只有一个数时为止。

这是典型的分治思想,即分治法。下面我们代码中的例子进行算法描述,讲解快速排序的排序步骤。

以 3 2 5 8 7 1 4 6 0 9的待排序的数列为例进行排序。首先我们需要在数列中选择一个基准数,我们一般会选择中间的一个数或者头尾的数,这里直接选择第 1 个数 3作为基准数,接着把比 3小的数字移动到左边,把比 3大的数字移动到右边,对于相等的数字不做移动。所以实际上我们需要找到中间的某个位置 k,这样 k 左边的值全部比 k 上的值小,k 右边的值全部比 k 上的值大。

接下来开始移动元素。怎么移动呢?其实冒泡排序也涉及对元素的移动,但是那样移动起来很累,比如把最后一个元素移动到第 1 个,就需要比较 n-1 次,同时交换 n-1 次,效率很低。其实,只需把第 1 个元素和最后一个元素交换就好了,这种思想是不是在排序时可以借鉴呢?之前说快速排序就是对冒泡排序的一个改进,就是这个原因。

快速排序的操作是这样的:首先从数列的右边开始往左边找,我们设这个下标为 i,也就是进行减减操作(i--),找到第 1 个比基准数小的值,让它与基准值交换;接着从左边开始往右边找,设这个下标为 j,然后执行加加操作(j++),找到第 1 个比基准数大的值,让它与基准值交换;然后继续寻找,直到 i 与 j 相遇时结束,最后基准值所在的位置即 k 的位置,也就是说 k 左边的值均比 k 上的值小,而 k 右边的值都比 k 上的值大。

这样就是一次比较,后面的子数组重复以上操作,到数组只有一个元素的时候就结束了,因为一个数组它就是有序的。

画图理解:

快速排序到底有多快

快速排序的特点与性能

快速排序是在冒泡排序的基础上改进而来的,冒泡排序每次只能交换相邻的两个元素,而快速排序是跳跃式的交换,交换的距离很大,因此总的比较和交换次数少了很多,速度也快了不少。
但是快速排序在最坏情况下的时间复杂度
和冒泡排序一样,是 O(n2),实际上每次比较都需要交换,但是这种情况并不常见。我们可以思考一下如果每次比较都需要交换,那么数列的平均时间复杂度是 O(nlogn),事实上在大多数时候,排序的速度要快于这个平均时间复杂度。这种算法实际上是一种分治法思想,也就是分而治之,把问题分为一个个的小部分来分别解决,再把结果组合起来。
快速排序只是使用数组原本的空间进行排序,所以所占用的空间应该是常量级的,但是由于每次划分之后是递归调用,所以递归调用在运行的过程中会消耗一定的空间,在一般情况下的空间复杂度为 O(logn),在最差的情况下,若每次只完成了一个元素,那么空间复杂度为 O(n)。所以我们一般认为快速排序的空间复杂度为 O(logn)
快速排序是一个不稳定的算法,在经过排序之后,可能会对相同值的元素的相对位置造成改变。
快速排序基本上被认为是相同数量级的所有排序算法中,平均性能最好的。
文章来源地址https://www.toymoban.com/news/detail-498801.html


到了这里,关于快速排序到底有多快的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 用Spring Boot 3.2虚拟线程搭建静态文件服务器有多快?

    Spring Boot 3.2 于 2023 年 11 月大张旗鼓地发布,标志着 Java 开发领域的一个关键时刻。这一突破性的版本引入了一系列革命性的功能,包括: 虚拟线程:利用 Project Loom 的虚拟线程释放可扩展性,从而减少资源消耗并增强并发性。 Native Image支持:通过Native Image编译制作速度极快

    2024年02月03日
    浏览(49)
  • Chatgpt到底有多牛?

    在人工智能领域, ChatGPT可以说是最具影响力的 AI之一。从全球最大的中文搜索引擎百度,到中国最大的新闻聚合网站人民日报,再到中国最大的知识问答网站知乎, ChatGPT都有不俗的表现。而在 ChatGPT被美国《时代周刊》评为“人工智能界的诺贝尔奖”后,其在全球范围内的

    2023年04月25日
    浏览(25)
  • 常见的Linux发行版配置要求到底有多低?

    常见的Linux发行版配置要求主要包括以下几个方面: 一般来说,64位的Linux发行版需要至少2GHz的CPU速度,对于较老的处理器,可以选择使用32位的Linux发行版。 Linux发行版通常需要至少1GB的RAM才能正常运行,对于较老的处理器,可以选择使用更低的RAM要求。 根据Linux发行版不同

    2024年02月07日
    浏览(30)
  • 碾压GPT-4!Claude3到底有多强?

    2024年3月4日,官方宣布推出 Claude 3 模型系列,它在广泛的认知任务中树立了新的行业基准。该系列包括三个按能力递增排序的最先进模型:Claude 3 Haiku、Claude 3 Sonnet 和 Claude 3 Opus。每个后续模型都提供越来越强大的性能,允许用户为其特定应用选择智能、速度和成本之间的最

    2024年03月12日
    浏览(45)
  • 技术宅小伙:ChatGPT的编程能力到底有多厉害?

        欢迎大家光临技术宅小伙的博客!     有特别多朋友问我     如何给自己制定一份     行之有效的编程学习计划     我最近发现CHATGPT在这方面特别棒     所以今天跟大家简单介绍一下     如何用CHATGPT根据我们自身的特点     帮我们制定一份行之有效的学习规划  

    2023年04月08日
    浏览(21)
  • 从入门到精通:30天速成黑客教程到底有多狠?

    首先我谈下对黑客网络安全的认知,其实最重要的是兴趣热爱,不同于网络安全工程师,他们大都是培训机构培训出来的,具备的基本都是防御和白帽子技能,他们绝大多数的人看的是工资,他们是为了就业而学习,为了走捷径才去参加培训。 而我进大厂主要是靠自学内推进

    2024年02月07日
    浏览(33)
  • Java工程师在IT行业到底有多受欢迎?

    在互联网+的影响下,这几年,在全球云计算和移动互联网的产业环境下,Java工程师为何会如此火爆? 1、Java开发就业现状以及发展前景 目前在软件类岗位,Java软件开发工程师所占的比例最大,达到60%以上。根据IDC的统计数字,在所有软件开发类人才的需求中,对Java工程师

    2023年04月09日
    浏览(28)
  • ChatGPT被淘汰了?Auto-GPT到底有多强

      大家好,我是可夫小子,关注AIGC、读书和自媒体。解锁更多ChatGPT、AI绘画玩法。   说Auto-GPT淘汰了ChatGPT了,显然是营销文案里面的标题党。毕竟它还是基于ChatGPT的API,某种意义只是基于ChatGPT能力的应用。但最近,AutoGPT确实又成为一个现象级的事件,上线不到一个月,g

    2024年02月02日
    浏览(34)
  • ChatGPT-5到底有多强?Battle!咱貌似也不输呀!

    盘点今年的热点话题,ChatGPT是不可避免要被反复提及的一part。从去年的-3.0到今年的-3.5,再到上月刚发布-4.0。从用户体验和市场反馈来讲,这半年的时间,ChatGPT每一步都走得又稳又快! 回想起今年2月初ChatGPT全网爆火的时候,其实当时心里是有点紧迫感的,不知道各位的感

    2024年02月01日
    浏览(32)
  • KIMI爆了!对比文心一言和通义千问它到底有多强?

    原文:赵侠客 最近国产大模型KIMI爆了大部分人应该都知道了,从我个人的感受来看这次KIMI爆了我不是从技术领域接触到的,而是从各种金融领域接触到的。目前国内大模型可以说是百模大战,前几年新能源大战,今年资本割完韭菜后留给我们的是一家家倒闭或者即将要倒闭的

    2024年04月10日
    浏览(73)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包