快速排序算法 的基本思想是:将所要进行排序的数分为左右两个部分,其中一部分的所有数据都比另外一

部分的数据小,然后将所分得的两部分数据进行同样的划分,重复执行以上的划分操作,直

到所有要进行排序的数据变为有序为止。

可能仅根据基本思想对快速排序的认识并不深,接下来以对n个无序数列A[0], A[1]…,

A[n-1]采用快速排序方法进行升序排列为例进行讲解。

(1)定义两个变量low和high,将low、high分别设置为要进行排序的序列的起始元素和最后一个元素的下标。第一次,low和high的取值分别为0和n-1,接下来的每次取值由划分得到的序列起始元素和最后一个元素的下标来决定。

(2)定义一个变量key,接下来以key的取值为基准将数组A划分为左右两个部分,通

常,key值为要进行排序序列的第一个元素值。第一次的取值为A[0],以后毎次取值由要划

分序列的起始元素决定。

(3)从high所指向的数组元素开始向左扫描,扫描的同时将下标为high的数组元素依次与划分基准值key进行比较操作,直到high不大于low或找到第一个小于基准值key的数组元素,然后将该值赋值给low所指向的数组元素,同时将low右移一个位置。

(4)如果low依然小于high,那么由low所指向的数组元素开始向右扫描,扫描的同时将下标为low的数组元素值依次与划分的基准值key进行比较操作,直到low不小于high或找到第一个大于基准值key的数组元素,然后将该值赋给high所指向的数组元素,同时将high左移一个位置。

(5)重复步骤(3)

(4),直到low的植不小于high为止,这时成功划分后得到的左右两部分分别为A[low……pos-1]和A[pos+1……high],其中,pos下标所对应的数组元素的值就是进行划分的基准值key,所以在划分结束时还要将下标为pos的数组元素赋值

为 key。

(6)将划分得到的左右两部分A[low……pos-1]和A[pos+1……high]继续采用以上操作步骤进行划分,直到得到有序序列为止。

为了能够加深读者的理解,接下来通过一段代码来了解快速排序的具体实现方法。

运行结果:

排序前

32 12 7 78 23 45

排序后

7 12 23 32 45 78

在上面的代码中,根据前面介绍的步骤一步步实现了快速排序算法。接下来通过示意图来演示第一次划分操作。

在第一次划分操作中,先进行初始设置,key的值是进行划分的基准,其值为要划分数

组的第一个元素值,在上面的排序序列中为第一个元素值32,同时将low设置为要排序数组中第一个元素的下标,第一次排序操作时其值为0,将high设置为要排序序列最后一个

元素的下标,在上面的排序序列中其第一次取值为5。先将下标为high的数组元素与key进行比较,由于该元素值大于key,因此high向左移动一个位置继续扫描。由于接下来的值为

23,小于key的值,因此将23赋值给下标为low所指向的数组元素。接下来将low右移一

个位置,将low所指向的数组元素的值与key进行比较,由干接下来的12、7都小于key,

因此low继续右移扫描,直至下标low所指向的数组元素的值为78即大于key为止,将78赋值给下标为high所指向的数组元素,同时将high左移一个位置。接下来由于low不再小于high,划分结束。需要注意的是,在进行划分的过程中,都是将扫描的值与key的值进行对比,如果小于key,那么将该值赋值给数组中的另外一个元素,而该元素的值并没有改变。

从图中可以看出这一点,所以需要在划分的最后将作为划分基准的key值赋值给下标为

pos的数组元素,这个元素不再参与接下来的划分操作。

第一次划分操作

第一轮划分结束后,得到了左右两部分序列A[0]、A[1]、A[2]和A[4]、A[5],继续进

行划分,即对毎轮划分后得到的两部分序列继续划分,直至得到有序序列为止。

快速排序算法-c语言实现,快速排序算法实现(C语言)(转)相关推荐

  1. 《数据结构与算法》实验报告——快速排序

    <数据结构>实验报告 学号:2018329621200 机器号 10-414-28 姓名: 申屠志刚 日期:2019/12/18 程序名:main.cpp 实验内容: 快速排序 目的和要求 ...

  2. 排序算法:归并排序、快速排序

    相关博客: 排序算法:冒泡排序.插入排序.选择排序.希尔排序 排序算法:归并排序.快速排序 排序算法:桶排序.计数排序.基数排序 排序算法:堆排序 十大排序算法小结 一.归并排序: 1.工作原理: 归 ...

  3. 小白的算法初识课堂(part4)--快速排序

    学习笔记 学习书目:<算法图解>- Aditya Bhargava 分而治之 在这里,我想通过2个例子介绍一种著名的递归式问题解决方法–分而治之(D&C) 分蛋糕 假如,我要分一块 ...

  4. 经典排序算法(2)——快速排序算法详解

    快速排序(Quick Sort)也是一种典型的交换排序算法,通过交换数据元素的位置进行排序. 一.算法基本思想 (1)基本思想 快速排序的基本思想就是:通过一趟排序将要排序的数据分割成独立的两部分,其 ...

  5. 冒泡和快速排序的时间复杂度_八大排序算法性能分析及总结

    一.排序算法说明 排序的定义:对一个无序的序列进行排序的过程. 输入:n个数:a1,a2,a3,-,an. 输出:n个数的排列:a1,a2,a3,-,an,使得a1<=a2<=a3< ...

  6. NOI提高级:排序算法之归并排序、快速排序

    图解排序算法(四)之归并排序 图解排序算法(四)之归并排序 - dreamcatcher-cx - 博客园 小学生图解排序算法:⑥归并排序 小学生图解排序算法:⑥归并排序_纯文笔记-CSDN博客_图解 ...

  7. 快速排序 python 4种写法_[算法] 关于快速排序的四种写法

    前序 说到排序算法,应该算是家喻户晓,人人皆知的大路货了.但是往往这些为人所熟知的东西中,也存在一些可以令人琢磨的细节. 这不,某天深夜,无所事事,大概是太寂寞,在思念了一番妹子以后,脑子里突然闪过了 ...

  8. 【Scratch算法讲解】04-Scratch快速排序 少儿编程Scratch常见排序算法案例分析讲解

    scratch快速排序 一.案例演示 [Scratch案例演示]Scratch快速排序 Scratch快速排序算法 高阶编程 二.案例介绍 什么是选择排序呢,在讲排序之前,要先跟小朋友们讲一下算法:什 ...

  9. 算法导论 实验三 快速排序及其优化

    目录 一.实验目的 二.实验内容 三.实验要求 四.算法设计与分析 五.详细设计与实现 六.结果分析 七.总结 一.实验目的 1. 理解快速排序的概念和基本思想 2. 了解适用快速排序的问题类型,并能 ...

  10. python 快速排序 详解_数据结构与算法:快速排序(原理讲解+python实现)

    快速排序 快速排序是一种基于分治法(Divide and Conquer)的排序算法 它之所以称为快速排序是因为它的平均时间复杂度为O(nlogn),最坏情况下是O(n2) 但是这样的情况不常见 一般 ...

最新文章

  1. Java程序员进阶——Spring依赖注入原理分析
  2. Python Split函数的用法总结
  3. Flutter之Decoration(边框、圆角、阴影、形状、渐变、背景图像等)
  4. 在C#里调用C++的dll时需要注意的一些问题转
  5. leetcode 354. 俄罗斯套娃信封问题(dp+二分)
  6. 全新威马E.5将于4月15日上市
  7. 深度学习主机攒机小记
  8. 中国水痘带状疱疹感染治疗药物市场趋势报告、技术动态创新及市场预测
  9. 嵌入式系统——软件知识产权
  10. 【Matlab学习笔记】【编程实例】二(将两幅灰度图片调整成相同的尺寸,然后左右拼接到一起)
  11. python反转数字_[蓝桥杯]使用列表反转的回文数(Python代码),数字,利用,取反
  12. eplan窗口宏与符号宏是什么_如何使用EPLAN里的宏值集?
  13. CAD导出.eps格式图
  14. lisp弧度转度分秒_度分秒转弧度)
  15. 创世神曲java官网_创世神曲官网下载
  16. 职场减压移魂大法几则 (转东转西)
  17. c语言写的一个恶意程序
  18. 实战 | 如何利用 Scrapy 编写一个完整的爬虫!
  19. OpenCV-Python图形图像处理:制作雪花飘落特效
  20. C语言return水仙花数,c语言(百合花)水仙花数的算法

热门文章

  1. git 命令操作手册大全
  2. 最新网络安全毕设选题题目推荐
  3. 老板们搞怪营业,品牌好感度upup真有梗
  4. HDOJ 4499 Cannon
  5. 三十四 我在软件园的那些日子里
  6. SpringBoot整合Mybatis说明,对Mybatis介绍和解释
  7. 【甄选靶场】Vulnhub百个项目渗透——项目七:DerpNStink-1(sql注入,流量分析)
  8. Dividing(背包)
  9. SQL性能分析工具SOAR介绍及实践
  10. 浏览器加载 CommonJS 模块的原理与实现