什么是快速排序

快速排序(英语:Quicksort),又称为交换排序,通过一趟排序将要排序的数据分割为 独立的两部分。假设要排序的列表是 A[0]……A[N-1],首先任意选取一个数据(通常选用 列表的第一个数)作为基准数据,然后将所有比它小的数都放到它左边,所有比它大的数都 放到它右边,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算 法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。


步骤

  1. 设置两个变量 low、high,排序开始的时候:low=0,high=N-1;

  2. 以第一个列表元素作为基准数据,赋值给 mid,即 mid=A[0];

  3. 从 high 开始向前搜索,即由后开始向前搜索(high–),找到第一个小于 mid 的值 A[high],将 A[hight]和 A[low]的值交换;

  4. 从 low 开始向后搜索,即由前开始向后搜索(low++),找到第一个大于 mid 的 A[low],将 A[low]和 A[high]的值交换;

  5. 重复第 3、4 步,直到 low=high;


快速排序的演示


时间复杂度

  • 最优时间复杂度:O(nlogn)
  • 最坏时间复杂度:O(n2)
  • 稳定性:不稳定

从一开始快速排序平均需要花费O(n log n)时间的描述并不明显。但是不难观察到的是分区运算,数组的元素都会在每次循环中走访过一次,使用O(n)的时间。在使用结合(concatenation)的版本中,这项运算也是O(n)。

在最好的情况,每次我们运行一次分区,我们会把一个数列分为两个几近相等的片段。这个意思就是每次递归调用处理一半大小的数列。因此,在到达大小为一的数列前,我们只要作log n次嵌套的调用。这个意思就是调用树的深度是O(log n)。但是在同一层次结构的两个程序调用中,不会处理到原来数列的相同部分;因此,程序调用的每一层次结构总共全部仅需要O(n)的时间(每个调用有某些共同的额外耗费,但是因为在每一层次结构仅仅只有O(n)个调用,这些被归纳在O(n)系数中)。结果是这个算法仅需使用O(n log n)时间。


代码实现

def quick_sort(alist, start, end):"""快速排序"""# 递归的退出条件if start >= end:return# 设定起始元素为要寻找位置的基准元素mid_value = alist[start]# low 为序列左边的由左向右移动的游标low = start# high 为序列右边的由右向左移动的游标high = endwhile low < high:#  如果 low 与 high 未重合,high 指向的元素不比基准元素小,则 high 向左移动while low < high and alist[high] >= mid_value:high -= 1# 将 high 指向的元素放到 low 的位置上alist[low] = alist[high]#  如果 low 与 high 未重合,low 指向的元素比基准元素小,则 low 向右移动while low < high and alist[low] < mid_value:low += 1# 将 low 指向的元素放到 high 的位置上alist[high] = alist[low]# 退出循环后,low 与 high 重合,此时所指位置为基准元素的正确位置# 将基准元素放到该位置alist[low] = mid_value# 对基准元素左边的子序列进行快速排序quick_sort(alist, start, low-1)# 对基准元素右边的子序列进行快速排序quick_sort(alist, low+1, end)if __name__ == '__main__':li = [13,14,94,33,82,25,59,94,65,23,45,27,73,25,39,10]print(li)quick_sort(li,0,len(li)-1)print(li)

结果:

[13, 14, 94, 33, 82, 25, 59, 94, 65, 23, 45, 27, 73, 25, 39, 10]
[10, 13, 14, 23, 25, 25, 27, 33, 39, 45, 59, 65, 73, 82, 94, 94]

数据结构与算法笔记(十)—— 快速排序相关推荐

  1. 数据结构与算法笔记 —— 十大经典排序及算法的稳定性

    一.十大经典排序算法 排序算法是<数据结构与算法>中最基本的算法之一. 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全 ...

  2. 数据结构与算法笔记(十六)—— 二叉搜索树

    一.二叉搜索树定义 二叉搜索树(Binary Search Tree),又名二叉排序树(Binary Sort Tree). 二叉搜索树是具有有以下性质的二叉树: 若左子树不为空,则左子树上所有节点的 ...

  3. 数据结构与算法笔记(十五)—— 散列(哈希表)

    一.前沿 1.1.直接寻址表 当关键字的全域U比较小时,直接寻址是一种简单而有效的技术.假设某应用要用到一个动态集合,其中每个元素都有一个取自全域U={0,1,-,m-1)的关键字,此处m是一个不很大 ...

  4. 数据结构与算法笔记(青岛大学王卓老师视频)

    写在前面的话: 因为在学习数据结构之前,学习过一年的算法,所以有一些基础,一些我觉得 没必要的代码或知识就没写上,记得多是一些知识点,写的可能对于别人来说 很难接受,望谅解.我学习算法是在Acwing ...

  5. 数据结构与算法笔记 - 绪论

    数据结构与算法笔记 - 绪论 1. 什么是计算 2. 评判DSA优劣的参照(直尺) 3. 度量DSA性能的尺度(刻度) 4. DSA的性能度量的方法 5. DSA性能的设计及其优化 x1. 理论模型与 ...

  6. JS数据结构与算法 笔记

    JS数据结构与算法笔记 前言:不定时更新说明 1. 栈(Stack) 1.1 基于数组实现栈 1.2 基于对象实现栈 1.3 基于链表实现栈 1.4 栈的简单应用 1.4.1 字符串中的括号匹配问题 ...

  7. 数据结构与算法:十大排序算法之归并排序

    数据结构与算法:十大排序算法之归并排序 package TopTenSortingAlgorithms;/*** 归并排序:Java** @author skywang* @date 2014/03/ ...

  8. 数据结构与算法:十大排序算法之插入排序

    数据结构与算法:十大排序算法之插入排序 package TopTenSortingAlgorithms;import java.util.Arrays; import java.util.Scanne ...

  9. 数据结构与算法:十大排序算法之堆排序

    数据结构与算法:十大排序算法之堆排序 堆排序可以说是选择排序的优化 package TopTenSortingAlgorithms;import java.util.Arrays; import ja ...

  10. 数据结构与算法:十大排序算法之冒泡排序

    数据结构与算法:十大排序算法之冒泡排序 package array;import java.util.Arrays;//冒泡排序 //1.比较数组中两个相邻的元素,如果第一个数比第二个数大,我们就交换 ...

最新文章

  1. java可以多重继承吗_Java中的多重继承与组合vs继承
  2. 第二章:2.1 微分方程、差分方程求解(概述)
  3. 上海理工大学第二届“联想杯”全国程序设计邀请赛 - Little Witch Academia(矩阵快速幂)
  4. centos 杀死进程命令kill
  5. android系统的发展态势,2020年安卓手机发展的7个趋势,只有延伸,并无革命性的变化...
  6. process调用protothread机制的相关宏定义——用HelloWorld进程诠释
  7. inux下切换到root权限有以下几种方式
  8. 第四届CSTQB®国际软件测试高峰论坛
  9. SpringCloudAlibaba电商项目实战
  10. 最新易企秀 微场景制作源码 易企秀去版权源码 带几百套模板
  11. matlab实用小程序段 —— 串口发送和读取
  12. sklearn中实现多分类任务(OVR和OVO)
  13. 【转载】因为专注,所以专业
  14. red5源码分析---12
  15. 微博开源框架Motan初体验
  16. 2020年全国计算机二级考试大纲改变,2020年3月计算机二级考试大纲内容
  17. 我奋斗了18年才能和你坐在一起喝咖啡
  18. 认识柯里化函数及其应用
  19. oracle如何导入一个用户,Oracle 把一个用户的数据导入另一个用户 (数据泵)
  20. php 正则匹配html中所有图片链接

热门文章

  1. 关于计算机应用技术的周记,计算机应用技术专业实习周记范文
  2. html5 游戏前景怎么样,独家 HTML5游戏目前究竟怎么样?看完这篇文章,你或许会清晰很多...
  3. python programming training(二): 排序算法
  4. MATLAB从入门到精通-matlab图像处理标记点追踪识别程序
  5. Tableau可视化分析实战系列浏览 Tableau 环境(四) -功能区和卡参考
  6. Flink从入门到精通100篇(十三)-Flink的入门教学
  7. 数学符号的读法和英文表示
  8. async function_掌握 Async/Await
  9. 如何用ipad制作精美的视频,并发布到视频网站
  10. spring boot 在eclipse里启动正常,但打包后启动不起来