生活消费
C语言实现快速排序及快速排序的优化和分析
2025-01-01 00:16

前言:C语言实现快速排序及其系统优化和分析

目录

一.快速排序的实现

1.实现思路

2.QSort实现

3.函数Partition()的实现

4.完整代码

 

 二.对快速排序的系统优化

1.对关键字pivotkey的选择优化

2.优化不必要的交换(把交换变成赋值

3.优化递归操作

4.!优化后的完整代码

 三.结语


快速排序的基本思路是:先在待排序数组中随便找一个数(其实找这个数也是有技巧的,后面会讲到,这个数也称作关键字,通过一趟排序将数组分成左右两部分左边的部分都比关键字小,中间是关键字,右边的部分都比关键字大。然后左右两部分又可以继续进行和刚刚一样的排序,直到整个数组有序。

例如

无序数组 26,1,7,56,34,23,77,87,22,43,16,66

1.我们先选出一个关键字,例如选了26

2.经过第一次排序后   就分成左右两部分  左边的部分比关键字小   中间是关键字  右边的部分比关键字大  

即16 1 7 22 23     26      77 87 34 43 56 66

3. 16 1 7 22 23 是左边部分

4.  26是关键字,即中间部分

5. 77 87 34 43 56 66 是右边部分

6.然后我们就可以对左右两部分继续这样的操作,所以快速排序的核心代码,就是如何把数组分成左右两部分!是不是听起来很简单!接下来我们就来实现

 

这里随便定义了一个数组int arr[] = { 26,1,7,56,34,23,77,87,22,43,16,66 },我们要做的就是在"pivot = Partition(arr, low, high)"中获取关键字的下标,并把数组变成

1.关键字在中间

2.关键字的左边均小于等于关键字的数值 

3.关键字的右边均大于等于关键字的数值

这也是函数Partition()的功能,所以接下来我们就要想办法实现函数Partition()。

 

经过依次Partition()后,数组arr[]就变成了arr= 16 1 7 22 23     26      77 87 34 43 56 66以数组arr首元素26为中心的两部分26右边的都比26大,26左边的都比26小,接着再次对左右两边继续递归排序就可以了,也就是下图画红线的两句代码

 

运行效果

  前面我们为了方便,都是选择数组的第一个元素当作关键字,这么随意肯定会有不好的地方,例如刚刚的待排序数组变成了arr[] = { 1,26,7,56,34,23,77,87,22,43,16,66 },若我们选择了第一个元素1,和选择其它任何一个数相比,很明显选择1就会显得很不合理,所以我们刚开始选择的关键字对我们排序速度的快慢有很大的影响。

  因此,我们想出了一个办法,在数组的左 中 右分别取一个数,然后再拿这三个数居中的那一个来当关键字pivotkey。在规模较小的排序中,这的确是一个好办法,但是在规模较大的数组中,其作用也是微乎其微,所以在规模较大的排序中,有时也有27数取9再取3再取1,也有9取3再取1的,其道理都一样,就是为了找出一个合适的关键字,加快排序的速度。

因此我们在确定关键字pivotkey前加上这几行代码

 

函数Paritition()就变成了这样

 
 

我们只需在把数组分成左右两部分之前,将关键字备份一份,然后在排序的过程中,数字间的交换直接改成赋值,会少了很多交换的步骤

 

原理也是一样在右边找到小的数,赋值到左边   在左边找大的数,赋值到右边   反正到最后,low和high都会同时指向关键字的下标,这时再把关键字的值还给它就得了。

经过上面几番操作,我们的Partition()函数变成了这样

 
 

我们将QSort()的函数改为

 

这样我们就减少了递归的次数,速度大大提高

 

运行效果

其实很多计算机语言的库函数都有快速排序这个函数,虽然各有不同,但是效果和速度都是差不多的,如果大家对C语言的快速排序库函数qsort感兴趣的话,可以翻阅博主的另一篇关于qsort的讲解,非常详细~最后大家有什么不懂的欢迎留言~


✨喜欢和觉得有用的不妨点个赞和关注吧~❤️

    以上就是本篇文章【C语言实现快速排序及快速排序的优化和分析】的全部内容了,欢迎阅览 ! 文章地址:http://ww.kub2b.com/news/17524.html
     栏目首页      相关文章      动态      同类文章      热门文章      网站地图      返回首页 企库往资讯移动站 http://ww.kub2b.com/mobile/ , 查看更多   
最新文章
京东万商 v6.2.2手机京东app下载「京东万商 v6.2.2」
uses-permission:'android.permission.INTERNET',允许程序访问网络连接,可能产生GPRS流量uses-permission:'android.permission.
三星Galaxy S8多少钱?三星Galaxy S8价格s8手机「三星Galaxy S8多少钱?三星Galaxy S8价格」
三星Galaxy S8多少钱  三星Galaxy S8的价格预计约6000元。   三星Galaxy S8基于Android7.0深度定制的UI,在主界面通过上下滑
如何设置路虎屏幕投屏?路虎手机「如何设置路虎屏幕投屏?」
要将手机屏幕内容投射到路虎车内的中控屏,有两种主要的方法,一种适用于安卓设备,一种适用于iPhone设备。首先,对于安卓设备,
林峯老婆张馨月再惹争议!用60元山寨手机壳被扒,删帖逃避引群嘲
娱乐圈从来不缺热闹,尤其是那些站在镁光灯边缘的“家属们”。最近,林峯的老婆张馨月(Carina)可谓是“热搜钉子户”,从检查离
百万新娘之爱无悔宝莲乘敏君沏茶的时候用她的手机给天祥发短信手机短信发不出去是什么原因「百万新娘之爱无悔宝莲乘敏君沏茶的时候用她的手机给天祥发短信」
很高兴和大家见面啦,我是小轮娱乐君,请多多指教。宝莲称敏君沏茶的时候,赶紧用她的手机给天祥发了短信,之后又装作有急事的样
小米手机怎么检测硬件,小米手机硬件检测教程
买了小米手机后,很多人会关心配置是否优越或存在不足。接下来,我将分享如何检测小米手机硬件的教程,帮助你了解设备性能与状况
京基智农2024年净利下滑59%
新京报讯(记者王思炀)4月1日,新京报记者了解到,日前召开2024年业绩说明会。2024年,京基智农实现营业收入59.60亿元,同比下
DNF:至尊天空价格&外观汇总!蝴蝶套最贵,墨染丹清最值得拿下
我们都知道自从DNF推出12套普通天空后,就不再推出了!虽说普通天空不再推出,但是至尊天空却一直在推出着。从第一套至尊天空若
两个android手机通过蓝牙连接手机蓝牙连接「两个android手机通过蓝牙连接」
在现代社会中,蓝牙已经成为了一种常见的无线通信技术。通过蓝牙,我们可以实现多种设备之间的连接和数据传输,比如手机与耳机、
炉石盒子工具版炉石传说盒子手机版「炉石盒子工具版」
炉石盒子工具版是一款非常好用的游戏辅助类应用,提供了很多的游戏资讯让用户可以第一时间掌握,而且还提供了最新的新手教学视频