【数据结构笔记】快速排序(quick_sort)和快速选择(quick_select)--Python2.7

要理解快排,可参考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( n 2 ) 。此时最好时间复杂为O( n 2 )
2.当分区选取的基准元素为待排序元素中的”中值”,为最好的情况,时间复杂度为O( n l o g 2 n )。
3.快速排序的空间复杂度为O( l o g 2 n ).
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( n 2 )

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]

猜你喜欢

转载自blog.csdn.net/m0_37477175/article/details/79703261