码迷,mamicode.com
首页 > 编程语言 > 详细

基础算法之快速排序算法

时间:2018-03-26 16:11:35      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:部分   大循环   while   最好   进入   重复   插入排序   print   排序   

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

比如序列[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 );退化为冒泡排序的情况

稳定性:不稳定

基础算法之快速排序算法

标签:部分   大循环   while   最好   进入   重复   插入排序   print   排序   

原文地址:https://www.cnblogs.com/yqpy/p/8650488.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!