快速排序基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
比如序列[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 );退化为冒泡排序的情况
稳定性:不稳定