快速排序 quick sort

  • 算法思想
  • 算法图解
  • 算法实现(C语言)
  • 性能分析

算法思想

快速排序算法是对冒泡排序算法的一种改进算法,在当前所有内部排序算法中,快速排序算法被认为是最好的排序算法之一。
快速排序的基本思想: 通过一趟排序将待排序的序列分割为左右两个子序列,左边的子序列中所有数据都比右边子序列中的数据小,然后对左右两个子序列继续进行排序,直到整个序列有序。
具体实现步骤是这样的,首先从序列中任意选择一个元素,把该元素作为枢轴,然后将小于等于枢轴的所有元素都移到枢轴的左侧,把大于枢轴的元素都移到枢轴的右侧。这样,以枢轴为界,划分出两个子序列,左侧子序列所有元素都小于右侧子序列。枢轴元素不属于任一子序列,并且枢轴元素当前所在位置就是该元素在整个排序完成后的最终位置。这样一个划分左右子序列的过程就叫做快速排序的一趟排序,或称为一次划分。递归此划分过程,直到整个序列有序。

算法图解

首先给出一个无序序列[21, 100, 3, 50, 1],选取一个元素为基准元素,一般选择序列第一个元素21作为枢轴,然后设置两个指针,一个low指针指向左侧第一个位置,一个high指针指向右侧最后一个位置。

首先取出基准元素21,此时low指向的位置留出一个空位。我们规定,指向空的指针不移动。此时应该操作high指针,如果high指针指向的元素大于基准元素21,那么high指针左移;如果high指针指向的元素小于基准元素21,那么将high指针指向的元素放到low指针指向的空位处。显然,当前high指向的1小于21,所以把1放到low指向的位置,此时high指向为空。

high指针指向空,操作low指针,对low指针:如果low指针指向元素小于基准元素21,那么low指针右移;如果low指针指向元素大于基准元素21,那么把low指针指向的元素放到high指向的空位处。

此时,100大于21,元素放到high,在代码中实际上就是交换low和high指向的元素值。


此时,low指向空,操作high,100大于21,high指针左移。

high指针指向50,依然大于21,high指针继续左移。

当high指向3的时候,3小于21,应交换元素。

此时,high指针指向空,操作low指针,low指向3,小于基准元素21,low指针右移。右移后我们发现,low指针和high指针指向同一个位置,此时将基准元素插入。

最后得到的序列,21左侧全部是小于21的元素,21右侧全部是大于21的元素。并且在本例中,划分好左右序列后,整个序列直接有序了。

算法实现(C语言)

void qSortArray(int array[], int start, int last)
{int low = start;int high = last;if (low < high){while (low < high){while (array[low] <= array[start] && low < last){low++;//满足小于基准的条件,指针右移}while (array[high] >= array[start] && high > start){high--;//满足大于基准的条件,指针左移}if (low < high){swap(array[low], array[high]);//交换两个不满足条件的元素}else{break;}}swap(array[start], array[high]);//插入基准元素qSortArray(array, start, high - 1);qSortArray(array, high + 1, last);}
}

性能分析

稳定性
由于在快速排序中,元素的比较和交换是跳跃进行的,所以快速排序是一种不稳定的排序算法。比如下图所示,在划分时就改变了序列中两个1原本的顺序,本来在后面的1跑到了前面。

复杂度分析
快速排序的平均时间复杂度是O(nlogn),但是在实际排序中,时间复杂度和基准元素(枢轴)的选择有关。如果枢轴选取不好,那么快速排序有可能就会退化为冒泡排序,时间复杂度为O(n*n)。
由于快速排序是通过递归实现的,而递归又要依靠栈空间来实现,所以快速排序相对于其它排序更耗费空间资源。
通常来说,为了避免快速排序退化为冒泡排序,以及递归栈过深的问题,我们一般依据“三者取中”的法则来选取基准元素,“三者”即序列首元素、序列尾元素、序列中间元素,在三者中取中值作为本趟快速排序的基准元素。




图解快排——快速排序算法(quick sort)相关推荐

  1. java sort算法名称_快速排序算法(Quick Sort)(java)

    /** * 快速排序算法是基于分治策略的一种排序算法,下面是一个递归的快速排序. * @author liuy */ public class QuickSort { public static vo ...

  2. C语言实现随机快速排序random quick sort算法(附完整源码)

    随机快速排序random quick sort算法 随机快速排序random quick sort算法的完整源码(定义,实现,main函数测试) 随机快速排序random quick sort算法的完 ...

  3. C#,双向链表(Doubly Linked List)快速排序(Quick Sort)算法与源代码

    双向链表 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点.一般我们都构造双 ...

  4. 排序——快速排序(Quick sort)

    概况 快速排序(Quick sort)是对冒泡排序的一种改进.快速排序由C. A. R. Hoare在1960年提出. 算法思路 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比 ...

  5. 图解排序算法及实现——快速排序 (Quick Sort)

    接下来让我们看看大名鼎鼎的快速排序,光名字就觉得牛哄哄. 快速排序 快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists).步骤如下 ...

  6. 排序算法总结(四)快速排序【QUICK SORT】

    感觉自己这几篇都是主要参考的Wikipedia上的,快排就更加是了....wiki上的快排挺清晰并且容易理解的,需要注意的地方我也添加上了注释,大家可以直接看代码.需要注意的是,wikipedia上快 ...

  7. 快速排序(Quick Sort)—挖坑填数法

    前面的博文讲了冒泡排序.选择排序.插入排序,今天我们谈谈快速排序! 快速排序的基本思想是: 1.先从序列中取出一个数作为基准数. 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它 ...

  8. 朴实无华,图解快排,多语言实现。(PS:还有宝藏资料)

    一.前言 快速排序是一种交换排序,它由C. A. R. Hoare在1962年提出. 二.算法思想 快速排序的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分:分割点左边都是比它小的数,右边都 ...

  9. 快速排序(quick sort) C++

    快速排序是个递归的过程,采取分而治之的思想.直接举例: 有10个数:1,3,7,9,5,8,10,2,4,6: 第一步:取最后一个数 6 为节点: 第二步:将小于6的放到左边,大于6的放到右边,结果: ...

最新文章

  1. 135 页的《机器学习速查手册》,公式、图表都有,附下载!
  2. Android ToolBar的使用
  3. cdh用户权限_cdh设置hdfs权限
  4. PHP数组缓存:三种方式JSON、序列化和var_export的比较
  5. VMware安装kali linux 和中文汉化方法
  6. 【kafka】kafka log 存储时间 小于 offset 存储时间 offset存在但是消费不到
  7. java跳出循环break;return;continue使用
  8. 金阳光测试算法专题——精选小算法汇总
  9. 如何获取华为网络安全考试题库?
  10. php soap wsse,改变xmlns:wsse命名空间在使用Python Zeep的SOAP请求中
  11. 计算机0x50006错误,你们安装win8使用崩溃多少次
  12. 冷山的博客思听有声书摘下载索引页
  13. JavsScript 节流函数 分金定穴
  14. 熊大微评微内核|华为“鸿蒙”所涉及的微内核究竟是什么?
  15. Qt TCP/UDP局域网通信软件 模仿QQ TIM
  16. WebLogic之eclipse安装WebLogic插件
  17. OpenGL学习05_点画模式(点画多边形)
  18. 【数据结构】内排序小结
  19. Mac 如何连接远程服务器
  20. 常用图像卷积核类型小结

热门文章

  1. android 实现微信的开门效果
  2. javafx vbox 居中_如何平均分配JavaFX VBox的元素
  3. ffmpeg命令分析-vn
  4. 关闭笔记本电脑触控板的方法
  5. Whale帷幄 - 内容智能分发 内容一键分发
  6. c语言arc函数带几个参数,ARC的使用简要总结
  7. abaqus流固耦合
  8. 软件联调测试报告范例,系统联调测试的报告(视频会议).doc
  9. CSS透明度[简述]
  10. Python|excel表格数据一键转json格式小工具|支持xlsx、xls格式转json|【源码+解析】