NB三人组:快速排序&选择排序&插入排序 (特点:原地排序,复杂度O(n²))

快速排序:

'''
快速排序:时间复杂度O(nlog2n)
利用归位函数进行递归调用
归位函数-左边都是比某元素小的,右边都是比某元素大的

快速排序至少比传统排序快100倍以上
快排弱点:
1.递归,比较消耗系统资源
2.最坏情况,如果一个倒序列表,时间复杂度O(n²),可以在归位前,随机选择一个数和第一个数交换,来尽可能避免最坏情况的出现。
'''
import sys
import random

sys.setrecursionlimit(100000)  # Python默认递归最大深度999,可以修改为100000


def partition(li, left, right):
    # 归位函数
    tmp = li[left]
    while left < right:
        while left < right and li[right] >= tmp:
            right -= 1
        li[left] = li[right]
        while left < right and li[left] <= tmp:
            left += 1
        li[right] = li[left]
    li[left] = tmp
    return left


def _quick_sort(li, left, right):
    # 递归
    if left < right:  # 保证至少有两个元素才继续归位,有一个或0个元素就结束归位
        random_loc = random.randrange(left, right)      
        li[left], li[random_loc] = li[random_loc], li[left]  # 随机交换位置,使快排最坏情况出现几率降到极低
        mid = partition(li, left, right)
        _quick_sort(li, left, mid - 1)
        _quick_sort(li, mid + 1, right)


def quick_sort(li):
    _quick_sort(li, 0, len(li) - 1)


# li = list(range(10000, 0, -1)) # 快速排序最坏情况

猜你喜欢

转载自www.cnblogs.com/staff/p/11411418.html