0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言排序中快速排序的技巧

C语言编程学习基地 来源:C语言编程学习基地 作者:C语言编程学习基地 2021-07-29 15:14 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。

算法步骤:

1 从数列中挑出一个元素,称为 “基准”(pivot)。

2 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。

3 递归(recursive)的把小于基准值元素的子数列和大于基准值元素的子数列排序。

递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。

C代码的实现如下:

613a930c-edfd-11eb-a97a-12bb97331649.png

下面开始单步分析,这里用一个数组的数据来分析

6155b786-edfd-11eb-a97a-12bb97331649.png

首先将0作为比较的基准,由于右边所有的数据都比0大,所以数据不做 移动。接下来将8作为比较基准,从最右边开始和8比较。此时6比8小,将6移动到8前面,其他数据依次后移。

6170fe9c-edfd-11eb-a97a-12bb97331649.png

接着在将2和8比较,2比8小,继续将2移动到8前面,其他的数据依次后移。

618a70ac-edfd-11eb-a97a-12bb97331649.png

这样将8小的数据移动到8的前面,比8大的数据在8后面保持不变。移动完成后如下:

61a3b332-edfd-11eb-a97a-12bb97331649.png

接下来比较的基准变为数字6,将比6小的数据移动到6前面。从最右边开始查找,找到1比6小,将1移动到6前面。

61bf9af2-edfd-11eb-a97a-12bb97331649.png

然后继续依次寻找比6小的数字,移动到6的前面,移动完成后如下:

61d63dde-edfd-11eb-a97a-12bb97331649.png

然后比较的基准变为数字5,从最右边开始寻找比5小的数移动到5前面。查找到的数据为2。

61f18e0e-edfd-11eb-a97a-12bb97331649.png

依次查找其他比5小的数据,移动完成后如下:

620c66ac-edfd-11eb-a97a-12bb97331649.png

到这里可以看到数据排序已经完成了。整体运行流程如下:

下面测试一下最坏情况下的排序情况

62398f06-edfd-11eb-a97a-12bb97331649.png

可以看到最坏情况下排序的次数并没有增多,反而感觉还减少了。在看一下最好情况下的排序情况:

62dcc02c-edfd-11eb-a97a-12bb97331649.png

最好情况下数据也要进行比较9次。

6322e912-edfd-11eb-a97a-12bb97331649.png

下来随机生成一个包含10000个数字的数组,测试下执行时间。

可以看到对10000个数字排序需要的时间为120ms。

634a06aa-edfd-11eb-a97a-12bb97331649.png

另外,对现在我们的大多数朋友来说还是学编程技术最重要!栽一棵树最好的时间是十年前,其次是现在。对于准备学习编程的小伙伴,如果你想更好的提升你的编程核心能力(内功)不妨从现在开始!

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    183

    文章

    7642

    浏览量

    144556

原文标题:【数据结构】C语言排序方法——快速排序详解!

文章出处:【微信号:cyuyanxuexi,微信公众号:C语言编程学习基地】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    C语言的常见算法

    # C语言常见算法 C语言中常用的算法可以分为以下几大类: ## 1. 排序算法 ### 冒泡排序
    发表于 11-24 08:29

    C语言特性

    ,开发者们可以在这些社区中分享经验、交流技术、解决问题。在社区,开发者们可以找到大量的开源项目、代码示例、技术文章等资源,为学习和使用 C 语言提供了有力的支持。当遇到技术难题时,在社区中提问往往能得到其他开发者的热心帮助,
    发表于 11-24 07:01

    C语言在嵌入式开发的应用

    1、控制系统开发 在工业控制领域,C 语言是当之无愧的中流砥柱。无论是工业自动化生产线的运动控制、温度控制、压力控制等系统,还是汽车电子的发动机控制单元(ECU)、防抱死制动系统(
    发表于 11-21 08:09

    C语言和单片机C语言有什么差异

    单片机c语言相对于普通C语言增加了一些基本的指令,还有变量的赋值是16进制,当然单片机c语言只牵
    发表于 11-14 07:55

    1688 拍立淘接口实战:从图像优化、工厂排序到供应链匹配(附可跑代码)

    深耕B2B电商十余年,亲历1688拍立淘接口20+坑:从图像预处理、权限申请到工厂排序。本文详解核心参数、实战代码及多图验证、定制方案生成等高级技巧,助你实现“看图找厂”精准匹配,附可运行代码,新手也能少走两年弯路。
    的头像 发表于 10-09 10:39 282次阅读

    使用env工具 生成的mdk工程 的 头文件路径太乱了怎么解决?

    能不能按照相似路径归类排序
    发表于 09-16 07:46

    分享一个嵌入式学习阶段规划

    给大家分享一个嵌入式学习阶段规划: (一)基础筑牢阶段(约 23 天) 核心目标:打牢 C 语言、数据结构、电路基础C 语言开发:学变量 / 指针 / 结构体等核心语法,用 Dev-
    发表于 09-12 15:11

    MiniVC6(C语言快速部署)资料

    MiniVC6(C语言快速部署)软件,无需安装。
    发表于 09-04 16:59 0次下载

    国际首创新突破!中国团队以存算一体排序架构攻克智能硬件加速难题

    2025 年 6 月 25 日,北京大学团队在智能计算硬件方面取得领先突破,国际上首次实现了基于存算一体技术的高效排序硬件架构 (A fast and reconfigurable
    的头像 发表于 07-02 16:50 539次阅读
    国际首创新突破!中国团队以存算一体<b class='flag-5'>排序</b>架构攻克智能硬件加速难题

    Analog Devices Inc. MAX16895 监控电路特性/应用/功能图

    Analog Devices MAX16895监控电路是小型、低功耗、电压监控电路,具有排序功能。这些器件具有可调的、低至0.5V的电压监控阈值,并可利用外部电容调节延迟时间。这些Analog Devices器件非常适合用于电源排序、复位
    的头像 发表于 06-26 09:34 541次阅读
    Analog Devices Inc. MAX16895 监控电路特性/应用/功能图

    低成本电源排序器解决方案

    绝大多数负载点DC-DC转换器可以将上一个转换器的电源就绪输出连接至下一个转换器的使能输入,实现上电排序。这种方法只适合比较简单的设计,不能满足多数现代微处理器和DSP的要求一这类器件要求断电顺序必须与上电顺序相反。许多厂商针对这类应用推出了可编程排序IC,但器件价格较为
    的头像 发表于 05-21 09:55 955次阅读
    低成本电源<b class='flag-5'>排序</b>器解决方案

    深入理解C语言C语言循环控制

    C语言编程,循环结构是至关重要的,它可以让程序重复执行特定的代码块,从而提高编程效率。然而,为了避免程序进入无限循环,C语言提供了多种循
    的头像 发表于 04-29 18:49 1728次阅读
    深入理解<b class='flag-5'>C</b><b class='flag-5'>语言</b>:<b class='flag-5'>C</b><b class='flag-5'>语言</b>循环控制

    51单片机C语言学习笔记

    c51语言快速入门
    发表于 03-24 14:04 3次下载

    详解Linux sort命令之掌握排序技巧与实用案例

    在linux系统使用过程,提供了sort排序命令,支持常用的排序功能。 常用参数 sort命令支持很多参数,常用参数如下:   短参数 长参数 说明 -n – number-sort 按字符串数值
    的头像 发表于 01-09 10:10 1580次阅读

    TimSort:一个在标准函数库中广泛使用的排序算法

    在计算机科学的领域,排序算法是每位学生必学的基础,而排序的需求是每位程序员在编程过程中都会遇到的。 在你轻松调用 .sort() 方法对数据进行排序时,是否曾好奇过,这个简单的方法背后使用的是哪种
    的头像 发表于 01-03 11:42 947次阅读