首页 > 技术文章 > 【算法】排序:快速排序

liuyuxuan 2020-12-06 17:29 原文

def quick_sort(list, left, right):
    if left >= right:
        return

    low = left
    high = right
    p = list[left]

    while left<right:
        while (left<right) and (list[right] >= p):
            right = right-1
        list[left] = list[right]
        while (left<right) and (list[left] < p):
            left = left+1
        list[right] = list[left]

    list[left] = p

    quick_sort(list, low, left-1)
    quick_sort(list, left+1, high)



if __name__ == '__main__':
    list_target = [2, 3, 1, 7, 5, 7, 9, 0, 9]

    quick_sort(list_target, 0, len(list_target)-1)
    print(list_target)

关键点:
序列切割:
1、挑中间元素:mid = alist[start]
2、右推进:while right > left and alist[right] >= mid:
3、左推进:while left < right and alist[left] < mid:
4、推进循环:while left < right:
5、元素归位:alist[left] = mid
递归拆分:
1、小组边界确定:left = start、right = end
2、递归退出条件:if start < end:
3、函数自调用:quick_sort(alist, start, end)

时间复杂度
最优时间复杂度:O(nlogn)
对于每次快排,left和right的标签分别在左右两册数据全部都移动了一遍,相当于遍历了所有数据,那么时间复杂度是O(n)
因为涉及到了递归分组,所以他的时间复杂度是O(logn)
整体来说:最优的时间复杂度是 O(nlogn)

最坏时间复杂度:O(n2)

因为递归分组分组的条件不一定是二分,有可能每一次mid指定的都是最大或者最小,那么有多少个元素,我们就可能分多少次组,这种情况时间复杂度就是O(n)了

所以最坏的时间复杂度就是O(n2),那么最坏也不过如此了。
稳定性:不稳定

 

推荐阅读