快速排序

快速排序(英语:Quicksort),⼜称划分交换排序(partitionexchangesort),通过⼀趟排序将要排序的数据分割成独⽴的两部分,其中⼀部分的所有数据都⽐另外⼀部分的所有数据都要⼩,然后再按此⽅法对这两部分数据分别进⾏快速排序,整个排序过程可以递归进⾏,以此达到整个数据变成有序序列。

步骤为:

  1. 从数列中挑出⼀个元素,称为"基准"(pivot),
  2. 重新排序数列,所有元素⽐基准值⼩的摆放在基准前⾯,所有元素⽐基准值⼤的摆在基准的后⾯(相同的数可以到任⼀边)。在这个分区 结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
  3. 递归地(recursive)把⼩于基准值元素的⼦数列和⼤于基准值元素的 ⼦数列排序.

递归的最底部情形,是数列的⼤⼩是零或⼀,也就是永远都已经被排序好了。虽然⼀直递归下去,但是这个算法总会结束,因为在每次的迭代(iteration)中,它⾄少会把⼀个元素摆到它最后的位置去。

快速排序的分析

def partition(arr, low, high):i = (low - 1)  # 最小元素索引pivot = arr[high]for j in range(low, high):# 当前元素小于或等于 pivotif arr[j] <= pivot:i = i + 1arr[i], arr[j] = arr[j], arr[i]arr[i + 1], arr[high] = arr[high], arr[i + 1]return (i + 1)# arr[] --> 排序数组
# low  --> 起始索引
# high  --> 结束索引# 快速排序函数
def quickSort(arr, low, high):if low < high:pi = partition(arr, low, high)quickSort(arr, low, pi - 1)quickSort(arr, pi + 1, high)if __name__ == '__main__':arr = [10, 7, 8, 9, 1, 5, 45, 23, 12, 67, 89]n = len(arr)quickSort(arr, 0, n - 1)print("排序后的数组:" , arr)

时间复杂度

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

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

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

用Python实现快速排序相关推荐

  1. python 快速排序_小白入门知识详解:Python实现快速排序的方法(含实例代码)...

    前言: 今天为大家带来的内容是:小白入门知识详解:Python实现快速排序的方法(含实例代码)希望通过本文的内容能够对各位有所帮助,喜欢的话记得点赞转发收藏不迷路哦!!! 提示: 这篇文章主要介绍了P ...

  2. python学习——python实现快速排序算法

    python实现快速排序算法 一.快速排序算法实现原理 基本思想 具体步骤 二.图解快速排序 三.py代码实现快速排序算法 一.快速排序算法实现原理 基本思想 先从数列中取出一个数作为基准数. 分区过 ...

  3. Python实现快速排序(非递归实现)

    快速排序同样也是分治的思想,核心依然是分而治之,各个击破. 快速排序的思想是:找到一个数字x,对数组nums进行排序,使x左侧的数字都小于x,右侧的数字都大于x,然后对左侧和右侧重复同样的操作,直到所 ...

  4. python实现快速排序算法_基础算法:快速排序(python实现)

    算法原理 快速排序是一个具有较高性能的排序算法,其主要思想如下: 对数组中的某个元素,确定其在数组中的排序位置,即在其之前的所有元素均小于该元素,在其之后的均大于该元素.对小元素组和大元素组同样执行该 ...

  5. python列表快速排序_python 实现快速排序

    一.快排思想 快速排序可以理解为是对冒泡排序的一种改进,把一组数,按照初始选定的标杆(参照数), 分别从两端开始排序,左端'i'只要小于标杆(参照数)的数,右端'j'只要大于标杆(参照数)的数, i- ...

  6. Python实现快速排序算法

    快速排序也是使用了分治思想的排序方法,但与归并排序不一样的是"分"的时候的依据.归并排序"分"的依据是对半分,不管大小,而快速排序则是选定数组中的一个值,以这个 ...

  7. Python 实现快速排序算法

    快速排序(Quick sort) 快速排序(Quick sort),又称划分交换排序 快速排序算法如下: 从数列中挑出一个元素,称为"基准"(pivot), 重新排序数列,所有元素 ...

  8. 算法 排序 python 实现--快速排序

    主要分为两个子算法,PARTITION(A, p, r)以A[r]为基准对数组进行一个划分,比A[r]小的放在左边,比A[r]大的放在右边.QUICKSORT(A, p, r)是快速排序的子程序,调用 ...

  9. Python版快速排序算法

    Python版冒泡排序算法请参考Python版冒泡法排序算法 Python版选择排序算法请参考Python版选择排序算法 from random import randint def quickSor ...

最新文章

  1. Nature Plants:根系微生物可以远程提高植物应对地上部环境胁迫的能力
  2. CGContextRef学习笔记
  3. NGINX根据不同域名请求跳转同一台机器的不同项目
  4. 三、python沉淀之路--列表(list)
  5. mysql grant 不想让用户看到 系统默认 mysql_MYSQL用户权限管理GRANT使用
  6. Java黑皮书课后题第6章:*6.2(求一个整数各位数字之和)编写一个方法,计算一个整数各位数字之和。使用下面的方法头:public static int sumDigits(long n)
  7. leetcode 212. Word Search II | 212. 单词搜索 II(Trie,回溯,DFS)
  8. CSS3新特性应用之用户体验
  9. Hadoop学习之pig
  10. 玩游戏学微积分!探索理工锻炼的游戏化应用, 腾讯发布新游戏《微积历险记》...
  11. 跨站请求伪造CSRF防护方法
  12. SAP License:SAP中的报表查询
  13. Eclipse:An internal error occurred during: Building workspace. GC overhead limit exceeded
  14. git学习笔记(1-集中式与分布式版本控制工具对比)
  15. erdas几何校正_实验一 ERDAS介绍与图像几何校正
  16. python使用list方法,将迭代器转换为列表后,再次循环打印迭代器输出为空
  17. 记录打包GoogleChrome浏览器插件
  18. opencv人脸识别(一)调用笔记本摄像头
  19. Proof_Of_Work机制
  20. 公司25k招了一个测试员不会自动化,试用期没过就赶走了...

热门文章

  1. 单例设计模式-饿汉式
  2. 分布式Session一致性概述
  3. Hmac - Java加密与安全
  4. 对原生ajax的理解
  5. 使用jquery进行多行表格数据验证
  6. kail linux稳定版本,Kali Linux 2020.3 稳定版已发布 更新后新功能概览
  7. delete 会不会锁表_MySQL的insert into select 引发锁表
  8. 如何使用 Java 中执行 Windows 的 CMD 命令
  9. 常用软件滤波算法---摘自:FeoTech
  10. 设计模式C++实现--Interpreter模式