要理解快排,可参考https://www.cnblogs.com/MOBIN/p/4681369.html,此处只有代码。
快速排序
复杂度分析:https://www.cnblogs.com/MOBIN/p/4681369.html
算法分析:
1.当分区选取的基准元素为待排序元素中的最大或最小值时,为最坏的情况,时间复杂度和直接插入排序的一样,移动次数达到最大值
Cmax = 1+2+…+(n-1) = n*(n-1)/2 = O( ) 。此时最好时间复杂为O( )
2.当分区选取的基准元素为待排序元素中的”中值”,为最好的情况,时间复杂度为O( )。
3.快速排序的空间复杂度为O( ).
4.当待排序元素类似[6,1,3,7,3]且基准元素为6时,经过分区,形成[1,3,3,6,7],两个3的相对位置发生了改变,所是快速排序是一种不稳定排序。
def quick_sort(li, start, end):
if start<end:
i,j=start,end
base = li[i]
while i<j:
while i<j and li[j] >= base:
j=j-1
li[i] = li[j]
while i<j and li[i] <= base:
i=i+1
li[j] = li[i]
li[i] = base
quick_sort(li, start,i)
quick_sort(li, i+1,end)
快速选择
输出数组中第K大的值。
算法复杂度 O(n) < O < O( )
def quick_select(li, start, end, k):
return sub_quick_select(li,start,end,k-1)
def sub_quick_select(li, start, end, k):
if start==end :
return li[start]
if start<end:
i,j=start,end
base = li[i]
while i<j:
while i<j and li[j] >= base:
j=j-1
li[i] = li[j]
while i<j and li[i] <= base:
i=i+1
li[j] = li[i]
li[i] = base
if start<i and k<i:
return sub_quick_select(li, start, i-1, k)
if end>i and k>i:
return sub_quick_select(li, i+1, end, k)
return li[i]