基础算法之快速排序算法

Posted 嶙羽

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基础算法之快速排序算法相关的知识,希望对你有一定的参考价值。

快速排序基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

比如序列[6,8,1,4,3,9],选取6为基准数key(不会变的),然后从右往左遍历过去,发现第一个比key小的数3,就把6和3交换位置,序列就变成了[3,8,1,4,6,9]

然后从左往右遍历过去,发现第一个比key大的值8,把8和6交换位置,序列变成[3,6,1,4,8,9]

以上称为一次小循环

然后再来一次循环,序列变成了[3,4,1,6,8,9],发现6的左边都是比6小的数,右边都是比6大的数,此时无法再遍历了,于是退出这个大循环

接下去,需要对key值左边的序列和右边的序列分别重复以上操作,也就是[3,4,1]和[8,9],只要用递归就行了。

代码如下:

 1 def quick_sort(array,left,right):
 2     if left >= right:
 3         return
 4 
 5     low = left#序列第一个索引
 6     high= right#序列最后一个索引
 7     key = array[low]#基准书数
 8 
 9     while low < high:#在左右未相遇的情况下
10         while low < high and array[high] > key:#找到右侧比key小的那个值
11             high -= 1
12         array[low] = array[high]
13         array[high] = key
14 
15         while low < high and array[low] <= key:#找到右侧比key大的值
16             low += 1 
17         array[high] = array[low]
18         array[low] = key
19 
20     quick_sort(array,left,low-1)#对key左边的序列进行递归
21     quick_sort(array,low+1,right)#对key右边的序列进行递归
22 array = [8,4,2,3,5,34,1,40] quick_sort(array,0,len(array)-1) print(array) # [1, 2, 3, 4, 5, 8, 34, 40]

需要注意的地方是,10和15行需要加上等于号,可以两个或者任意一个,不然遇上序列中有多个相同的值会进入死循环

直接插入排序复杂度: 

时间复杂度: 最好情况O(nlogn), 最坏情况O(n^2), 平均情况O(nlogn)

下面空间复杂度是看别人博客的,我也不大懂了……改天再研究下。

最优的情况下空间复杂度为:O(logn);每一次都平分数组的情况
最差的情况下空间复杂度为:O( n );退化为冒泡排序的情况

稳定性:不稳定

以上是关于基础算法之快速排序算法的主要内容,如果未能解决你的问题,请参考以下文章

重温基础算法内部排序之快速排序法

基础算法系列之排序算法[快速排序,归并排序,二分查找]

基础算法之快速排序算法

45期盘点那些必问的数据结构算法题之基础排序

java基础算法之快速排序

C语言编程入门笔记基础学习排序算法之快速排序,轻松掌握快排!