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语言
    +关注

    关注

    180

    文章

    7522

    浏览量

    127467

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

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

收藏 人收藏

    评论

    相关推荐

    C语言实现经典排序算法概览

    冒泡排序(英语:Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。
    的头像 发表于 02-25 12:27 222次阅读
    C<b class='flag-5'>语言</b>实现经典<b class='flag-5'>排序</b>算法概览

    十大排序算法总结

    排序算法是最经典的算法知识。因为其实现代码短,应该广,在面试中经常会问到排序算法及其相关的问题。一般在面试中最常考的是快速排序和归并排序等基
    的头像 发表于 12-20 10:39 710次阅读

    python升序和降序排序代码

    Python是一种简洁而强大的编程语言,提供了许多实用的函数和方法来排序数据。在本文中,我们将详细讨论Python中的升序和降序排序。我们将深入探讨不同的排序算法、它们的复杂度以及如何
    的头像 发表于 11-21 15:20 903次阅读

    排序算法有哪些

    1. 归并排序(递归版) 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治策略,即分为两步:分与治。 分:先递归分解数组成子数组 治:将分阶段得到的子数组按顺序
    的头像 发表于 10-11 15:49 319次阅读
    <b class='flag-5'>排序</b>算法有哪些

    jwt冒泡排序的原理

    jwt简介 冒泡排序: (Bubble Sort)是一种简单的交换排序。之所以叫做冒泡排序,因为我们可以把每个元素当成一个小气泡,根据气泡大小,一步一步移动到队伍的一端,最后形成一定对的顺序。 冒泡
    的头像 发表于 09-25 16:33 309次阅读
    jwt冒泡<b class='flag-5'>排序</b>的原理

    排序算法之选择排序

    选择排序: (Selection sort)是一种简单直观的排序算法,也是一种不稳定的排序方法。 选择排序的原理: 一组无序待排数组,做升序排序
    的头像 发表于 09-25 16:30 835次阅读
    <b class='flag-5'>排序</b>算法之选择<b class='flag-5'>排序</b>

    list.sort()排序比stream().sorted()排序性能更好吗?

    看到一个评论,里面提到了list.sort()和list.strem().sorted()排序的差异。
    的头像 发表于 08-09 10:27 566次阅读
    list.sort()<b class='flag-5'>排序</b>比stream().sorted()<b class='flag-5'>排序</b>性能更好吗?

    FPGA排序-冒泡排序介绍

    排序算法是图像处理中经常使用一种算法,常见的排序算法有插入排序、希尔排序、选择排序、冒泡排序、归
    发表于 07-17 10:12 660次阅读
    FPGA<b class='flag-5'>排序</b>-冒泡<b class='flag-5'>排序</b>介绍

    Python实现的常见内部排序算法

    排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因
    发表于 07-06 12:35 256次阅读
    Python实现的常见内部<b class='flag-5'>排序</b>算法

    C语言实现十大经典排序算法

    比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序
    发表于 06-25 10:23 271次阅读
    C<b class='flag-5'>语言</b>实现十大经典<b class='flag-5'>排序</b>算法

    常见排序算法分类

    本文将通过动态演示+代码的形式系统地总结十大经典排序算法。 排序算法 算法分类 —— 十种常见排序算法可以分为两大类: 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能
    的头像 发表于 06-22 14:49 620次阅读
    常见<b class='flag-5'>排序</b>算法分类

    利用强化学习来探索更优排序算法的AI系统

    去探索更优的排序算法,因为相对于高级编程语言来说,在汇编指令层级对存储和寄存器的操作可以更加的灵活,所以能发现更多潜在的调优策略。 在 AlphaDev 的论文中,只关注探索短序列排序: 定长序列
    的头像 发表于 06-19 10:49 388次阅读
    利用强化学习来探索更优<b class='flag-5'>排序</b>算法的AI系统

    C语言经典排序算法总结

    本文将通过动态演示+代码的形式系统地总结十大经典排序算法。
    发表于 06-05 10:56 387次阅读
    C<b class='flag-5'>语言</b>经典<b class='flag-5'>排序</b>算法总结

    SAS:字符型变量的两种排序方式

    在做AE一类的table时,经常会有要求,需要我们先按照例次降序排序,如果例次相同按照SOC拼音首字母排序,例次降序排好理解,但是怎样才能实现对字符型变量按照拼音排序呢?
    的头像 发表于 05-19 10:41 2330次阅读
    SAS:字符型变量的两种<b class='flag-5'>排序</b>方式

    4芯、12芯、48芯、96芯、126芯光缆颜色排序-科兰

    多次有朋友留言问到,光纤熔接颜色如何排序,这个在实际应用中还是比较多的,那么今天我们就不讲原理了,直接用图文简单明了讲光纤熔接色谱,大家可以了解下。 一、常规排序 1、4芯的排序
    的头像 发表于 05-18 10:57 4198次阅读
    4芯、12芯、48芯、96芯、126芯光缆颜色<b class='flag-5'>排序</b>-科兰