用Python实现快速排序
快速排序
快速排序(英语:Quicksort),⼜称划分交换排序(partitionexchangesort),通过⼀趟排序将要排序的数据分割成独⽴的两部分,其中⼀部分的所有数据都⽐另外⼀部分的所有数据都要⼩,然后再按此⽅法对这两部分数据分别进⾏快速排序,整个排序过程可以递归进⾏,以此达到整个数据变成有序序列。
步骤为:
- 从数列中挑出⼀个元素,称为"基准"(pivot),
- 重新排序数列,所有元素⽐基准值⼩的摆放在基准前⾯,所有元素⽐基准值⼤的摆在基准的后⾯(相同的数可以到任⼀边)。在这个分区 结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
- 递归地(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实现快速排序相关推荐
- python 快速排序_小白入门知识详解:Python实现快速排序的方法(含实例代码)...
前言: 今天为大家带来的内容是:小白入门知识详解:Python实现快速排序的方法(含实例代码)希望通过本文的内容能够对各位有所帮助,喜欢的话记得点赞转发收藏不迷路哦!!! 提示: 这篇文章主要介绍了P ...
- python学习——python实现快速排序算法
python实现快速排序算法 一.快速排序算法实现原理 基本思想 具体步骤 二.图解快速排序 三.py代码实现快速排序算法 一.快速排序算法实现原理 基本思想 先从数列中取出一个数作为基准数. 分区过 ...
- Python实现快速排序(非递归实现)
快速排序同样也是分治的思想,核心依然是分而治之,各个击破. 快速排序的思想是:找到一个数字x,对数组nums进行排序,使x左侧的数字都小于x,右侧的数字都大于x,然后对左侧和右侧重复同样的操作,直到所 ...
- python实现快速排序算法_基础算法:快速排序(python实现)
算法原理 快速排序是一个具有较高性能的排序算法,其主要思想如下: 对数组中的某个元素,确定其在数组中的排序位置,即在其之前的所有元素均小于该元素,在其之后的均大于该元素.对小元素组和大元素组同样执行该 ...
- python列表快速排序_python 实现快速排序
一.快排思想 快速排序可以理解为是对冒泡排序的一种改进,把一组数,按照初始选定的标杆(参照数), 分别从两端开始排序,左端'i'只要小于标杆(参照数)的数,右端'j'只要大于标杆(参照数)的数, i- ...
- Python实现快速排序算法
快速排序也是使用了分治思想的排序方法,但与归并排序不一样的是"分"的时候的依据.归并排序"分"的依据是对半分,不管大小,而快速排序则是选定数组中的一个值,以这个 ...
- Python 实现快速排序算法
快速排序(Quick sort) 快速排序(Quick sort),又称划分交换排序 快速排序算法如下: 从数列中挑出一个元素,称为"基准"(pivot), 重新排序数列,所有元素 ...
- 算法 排序 python 实现--快速排序
主要分为两个子算法,PARTITION(A, p, r)以A[r]为基准对数组进行一个划分,比A[r]小的放在左边,比A[r]大的放在右边.QUICKSORT(A, p, r)是快速排序的子程序,调用 ...
- Python版快速排序算法
Python版冒泡排序算法请参考Python版冒泡法排序算法 Python版选择排序算法请参考Python版选择排序算法 from random import randint def quickSor ...
最新文章
- Nature Plants:根系微生物可以远程提高植物应对地上部环境胁迫的能力
- CGContextRef学习笔记
- NGINX根据不同域名请求跳转同一台机器的不同项目
- 三、python沉淀之路--列表(list)
- mysql grant 不想让用户看到 系统默认 mysql_MYSQL用户权限管理GRANT使用
- Java黑皮书课后题第6章:*6.2(求一个整数各位数字之和)编写一个方法,计算一个整数各位数字之和。使用下面的方法头:public static int sumDigits(long n)
- leetcode 212. Word Search II | 212. 单词搜索 II(Trie,回溯,DFS)
- CSS3新特性应用之用户体验
- Hadoop学习之pig
- 玩游戏学微积分!探索理工锻炼的游戏化应用, 腾讯发布新游戏《微积历险记》...
- 跨站请求伪造CSRF防护方法
- SAP License:SAP中的报表查询
- Eclipse:An internal error occurred during: Building workspace. GC overhead limit exceeded
- git学习笔记(1-集中式与分布式版本控制工具对比)
- erdas几何校正_实验一 ERDAS介绍与图像几何校正
- python使用list方法,将迭代器转换为列表后,再次循环打印迭代器输出为空
- 记录打包GoogleChrome浏览器插件
- opencv人脸识别(一)调用笔记本摄像头
- Proof_Of_Work机制
- 公司25k招了一个测试员不会自动化,试用期没过就赶走了...