排序是算法的入门知识,应用广泛,且在程序员面试中,经常被提及,其中最常考的两大排序算法为快速排序与归并排序,本篇将使用Python语言来分析了解快速排序算法。


思想

快速排序是一种非常高效的排序算法,采用 “分而治之” 的思想,把大的拆分为小的,小的拆分为更小的。其原理是,对于给定的记录,选择一个基准数,通过一趟排序后,将原序列分为两部分,使得前面的比后面的小,然后再依次对前后进行拆分进行快速排序,递归该过程,直到序列中所有记录均有序。

步骤

设当前待排序序列为R[low:high],其中low ≤ high,如果待排序的序列规模足够小,则直接进行排序,否则分3步处理。

1、分解

在R[low:high]中选定一个元素R[pivot],以此为标准将要排序的序列划分为两个序列R[low:pivot-1]与R[pivot+1:high],并使序列R[low:pivot-1]中所有元素的值小于等于R[pivot],序列R[pivot+1:high]所有的值大于R[pivot],此时基准元素以位于正确位置,它无需参加后续排序。

2、递归

对于子序列R[low:pivot-1]与R[pivot+1:high],分别调用快速排序算法来进行排序。

3、合并

由于对序列R[low:pivot-1]与R[pivot+1:high]的排序是原地进行的,所以R[low:pivot-1]与R[pivot+1:high]都已经排好序后,不需要进行任何计算,就已经排好序。

注:基准元素,一般来说选取有几种方法

  • 取第一个元素
  • 取最后一个元素
  • 取第中间位置元素
  • 取第一个、最后一个、中间位置3者的中位数元素

图解

假设当前排序为R[low:high],其中low ≤ high。

1:首先取序列第一个元素为基准元素pivot=R[low]。i=low,j=high。 2:从后向前扫描,找小于等于pivot的数,如果找到,R[i]与R[j]交换,i++。 3:从前往后扫描,找大于pivot的数,如果找到,R[i]与R[j]交换,j--。 4:重复2~3,直到i=j,返回该位置mid=i,该位置正好为pivot元素。 完成一趟排序后,以mid为界,将序列分为两部分,左序列都比pivot小,有序列都比pivot大,然后再分别对这两个子序列进行快速排序。

以序列(30,24,5,58,18,36,12,42,39)为例,进行演示

1、初始化,i=low,j=high,pivot=R[low]=30

2、从后往前找小于等于pivot的数,找到R[j]=12

R[i]与R[j]交换,i++

3、从前往后找大于pivot的数,找到R[i]=58

R[i]与R[j]交换,j--

4、从后往前找小于等于pivot的数,找到R[j]=18

R[i]与R[j]交换,i++

5、从前往后找大于pivot的数,这时i=j,第一轮排序结束,返回i的位置,mid=i

此时已mid为界,将原序列一分为二,左子序列为(12,24,5,18)元素都比pivot小,右子序列为(36,58,42,39)元素都比pivot大。然后在分别对两个子序列进行快速排序,最后即可得到排序后的结果。

复杂度分析

  • 最好的时间复杂度为:O(nlogn)

分解:划分函数需要扫描每个元素,每次扫描元素不超过n,时间复杂度为O(n) 解决子问题:在理想的情况下,每次划分将问题分解为两个规模为n/2的子问题,递归求解两个规模的子问题。所需时间为2T(n/2) 合并:因为是原地排序,合并不需要时间复杂度 因此总运行时间为

T(n)={ O(1) , n=12T(n/2)+O(n) , n>1 }

最终求解为最好的时间复杂度为O(nlogn)

  • 最坏的时间复杂度为: O(n²)

分解:划分函数需要扫描每个元素,每次扫描元素不超过n,时间复杂度为O(n) 解决子问题:在最坏的情况下,每次划分将问题分解后,基准元素的一侧没有元素,其中一侧为规模为n-1的子问题,递归求解该子问题,所需时间为T(n-1)。 合并:因为是原地排序,合并不需要时间复杂度 因此总运行时间为

T(n)={ O(1) , n=1T(n-1)+O(n) , n>1 }

最终求解为最好的时间复杂度为O(n²)

  • 平均时间复杂度为:O(nlogn)
  • 平均空间复杂度为:O(logn)

python实现

def 

博主GitHub page地址:

影​zhan123.xin

快速排序算法_Python实现快速排序算法相关推荐

  1. python快速排序代码_Python实现快速排序算法

    原标题:Python实现快速排序算法 Python实现快速排序算法 快速排序算法是一种基于交换的高效的排序算法,由C.R.A.Hoare于1962年提出,是一种划分交换排序.它采用了一种分治的策略,通 ...

  2. python实现ks算法_Python实现Dijkstra算法

    Dijkstra算法 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要 ...

  3. python实现排列组合公式算法_Python实现卡尔曼滤波算法之贝叶斯滤波

    Python实现卡尔曼滤波算法之贝叶斯滤波 作者:yangjian 卡尔曼滤波器属于贝叶斯滤波器的一种特例,本文主要讲解贝叶斯滤波原理及其算法的python实现. 先来看下贝叶斯公式 贝叶斯公式 :后 ...

  4. python谱聚类算法_Python机器学习高级算法!谱聚类(Spectal Clustering)算法分析和实例详解...

    谱聚类(Spectal Clustering)算法是聚类算法的一种,比起传统的K-Means聚类算法,谱聚类算法的效果更优秀,其计算量也小很多,除了谱聚类和K-Means聚类算法,另外还有密度聚类和层 ...

  5. python中值滤波算法_Python实现卡尔曼滤波算法之贝叶斯滤波

    Python实现卡尔曼滤波算法之贝叶斯滤波 作者:yangjian 卡尔曼滤波器属于贝叶斯滤波器的一种特例,本文主要讲解贝叶斯滤波原理及其算法的python实现. 先来看下贝叶斯公式 贝叶斯公式 :后 ...

  6. python实现快排算法_Python实现快速排序算法

    Python实现快速排序算法 快速排序算法是一种基于交换的高效的排序算法,由C.R.A.Hoare于1962年提出,是一种划分交换排序.它采用了一种分治的策略,通常称其为分治法(Divide and ...

  7. python快速排序算法_Python实现快速排序算法及去重的快速排序的简单示例

    快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用. 该方法的基本思想是: 1.先从数列中取出一个数作为基准数. 2.分区过程,将比这个数大的数全放到它的右边,小于或 ...

  8. 用python排序算法_Python - 八大排序算法

    1.序言 本文使用Python实现了一些常用的排序方法.文章结构如下: 1.直接插入排序 2.希尔排序 3.冒泡排序 4.快速排序 5.简单选择排序 6.堆排序 7.归并排序 8.基数排序 上述所有的 ...

  9. python实现冒泡排序完整算法_Python实现冒泡排序算法的完整实例

    冒泡排序:顾名思义就是(较小的值)像泡泡一样往上冒,(大的值)往下沉. 实现原理:依次将相邻两个数值进行比较,较小的数值移到左边,较大的数值移到右边,依次比较完第一轮后,最大的数值应该排在最右边.然后 ...

最新文章

  1. SQL--(MyBatis 实战)
  2. sess.run()详解
  3. 【Linux多线程】三个经典同步问题
  4. 编程十年 (4):步入编程殿堂
  5. 基于Docker本地运行k8s(单节点)
  6. 探测器反向偏压_Y5T60 为何探测器和电吸收调制器,加反电压,而不是正电压
  7. Typesafe公司正式更名为Lightbend公司
  8. jsencrypt加密同一值返回不同密文_密码学原语如何应用?解析密文同态性的妙用...
  9. 软件加入使用时间_你有了抢口罩软件,电商也进行了升级,我们又有了新软件(3月2日更新)...
  10. 理解SVN中trunk,branches,tags
  11. 循序渐进的手动安装k8s笔记-1
  12. xlsx文件打开乱码_excel表格文件打开都是乱码怎么解决
  13. 1. Xamarin开发入门
  14. UPF和POWER Domain
  15. 云计算与网格计算的区别
  16. 讯飞配音使用记录:Excel VBA 编程处理多段短文字配音切分及 Hedit、GoldWave 后期处理、编程合成 WAV 文件
  17. 税务局计算机相关岗位,国家公务员 县区级国税局招收计算机专业的,进去之后做什么。虽然是计算机专业,但学的不好。不知需要这个 - 赏学吧...
  18. ThinkPad F1按键常亮且喇叭无声音
  19. 巧用TP-LINK无线路由器连接IPv6网络
  20. 【办公自动化】“一键”生成国土空间规划CAD标准图层

热门文章

  1. 监控系统简介:使用 Prometheus 与 Grafana
  2. .NET gRPC核心功能初体验
  3. WinUI 3 Preview 3 发布了,再一次试试它的性能
  4. SQL Server in Docker - 还原数据库
  5. 国际化组件 Unicode (ICU) 函数库
  6. 简单快速导出word文档
  7. 科个普:进程、线程、并发、并行
  8. CAP 3.0 版本正式发布
  9. 【.NET Core 跨平台 GUI 开发】第三篇:Gtk# 表格布局与事件处理
  10. Asp.Net Core 单元测试正确姿势