Python排序算法一—快速排序
排序算法(Sorting algorithm)是计算机科学最古老、最基本的课题之一。要想成为合格的程序员,就必须理解和掌握各种排序算法。其中”快速排序”(Quicksort)使用得最广泛,速度也较快。它是图灵奖得主C. A. R. Hoare(托尼·霍尔)于1960时提出来的。
一、快速排序(Quicksort)
快速排序(quick sort)的采用了分治的策略。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
1、原理
-
在数列之中,选择一个元素作为”基准”(pivot),或者叫比较值。
-
数列中所有元素都和这个基准值进行比较,如果比基准值小就移到基准值的左边,如果比基准值大就移到基准值的右边
-
以基准值左右两边的子列作为新数列,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。
举个例子,假设我现在有一个数列需要使用快排来排序:[11, 99, 33 , 69, 77, 88, 55, 11, 33, 36,39, 66, 44, 22],我们来看看使用快排的详细步骤:
-
选取中间的
66
作为基准值(基准值可以随便选) -
数列从第一个元素11开始和基准值
66
进行比较,小于基准值,那么将它放入左边的分区中,第二个元素99比基准值66
大,把它放入右边的分区中。 -
然后依次对左右两个分区进行再分区,直到最后只有一个元素
-
分解完成再一层一层返回,返回规则是:左边分区+基准值+右边分区
2、代码
代码用jupyternotebook实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | def quick_sort(b): 2 "" "快速排序" "" 3 if len(b) < 2 : 4 return arr 5 # 选取基准,随便选哪个都可以,选中间的便于理解 6 mid = arr[len(b) // 2] 7 # 定义基准值左右两个数列 8 left, right = [], [] 9 # 从原始数组中移除基准值 10 b.remove(mid) 11 for item in b: 12 # 大于基准值放右边 13 if item >= mid: 14 right.append(item) 15 else : 16 # 小于基准值放左边 17 left.append(item) 18 # 使用迭代进行比较 19 return quick_sort(left) + [mid] + quick_sort(right) |
例
1 2 3 4 | b = [ 11 , 99 , 33 , 69 , 77 , 88 , 55 , 11 , 33 , 36 , 39 , 66 , 44 , 22 ] quick_sort(b) #返回:[ 11 , 11 , 22 , 33 , 33 , 36 , 39 , 44 , 55 , 66 , 69 , 77 , 88 , 99 ] |
高逼格(一行代码表示):
1 2 3 4 5 6 | quick_sort = lambda array: array if len(array) <= 1 else quick_sort([ 2 item for item in array[ 1 :] if item <= array[ 0 ] 3 ]) + [array[ 0 ]] + quick_sort([item for item in array[ 1 :] if item > array[ 0 ]]) 4 5 quick_sort([ 2 , 5 , 9 , 3 , 7 , 1 , 5 ]) 6 #返回[ 1 , 2 , 3 , 5 , 5 , 7 , 9 ] |
3、特点
-
稳定性:快排是一种不稳定排序,比如基准值的前后都存在与基准值相同的元素,那么相同值就会被放在一边,这样就打乱了之前的相对顺序
-
比较性:因为排序时元素之间需要比较,所以是比较排序
-
时间复杂度:快排的时间复杂度为O(nlogn)
-
空间复杂度:排序时需要另外申请空间,并且随着数列规模增大而增大,其复杂度为:O(nlogn)
-
归并排序与快排 :归并排序与快排两种排序思想都是分而治之,但是它们分解和合并的策略不一样:归并是从中间直接将数列分成两个,而快排是比较后将小的放左边大的放右边,所以在合并的时候归并排序还是需要将两个数列重新再次排序,而快排则是直接合并不再需要排序,所以快排比归并排序更高效一些,可以从示意图中比较二者之间的区别。
- 快速排序有一个缺点就是对于小规模的数据集性能不是很好。
原文:https://www.cnblogs.com/pythonbao/p/10768593.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~