解决最坏情况快速排序之随机序列

本文介绍了一种改进的快速排序算法,通过随机化输入序列来优化排序效率,避免最坏情况的发生,确保算法复杂度稳定在O(nlgn)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

快速排序非常快,不过最慢的时候也挺慢的。

这是一个依赖于随机化输入的算法。

所以我想了一招,来随机化这个输入,达到最棒的效果。

首先,普通的快速排序如下:

def qsort(arr,lo,hi):
    if hi-lo<=1:
        return
    pivot=arr[lo]
    i,j=lo+1,hi-1
    while True:
        while i<hi and arr[i]<=pivot:
            i+=1
        while j>lo and arr[j]>=pivot :
            j-=1
        if i>=j:
            break
        arr[i], arr[j] = arr[j], arr[i]
    arr[lo], arr[j] = arr[j], arr[lo]
    qsort(arr,lo,j)
    qsort(arr,j+1,hi)

def quick_sort(arr):
    qsort(arr,0,len(arr))

这个是一种选取了第一个元素当枢纽元的快速排序。

但是如果序列是[0,1,2,3.....n-1]这n个元素呢?

那么时间函数就是T(n)=T(1)+T(n-1)+o(n)

求一下,是n^2诶。我还不如用插入排序呢。。。好歹写起来快。

那么如果我把它随机化一下呢?

def __random_list(arr):
    import random
    i=len(arr)//2
    length=len(arr)
    while i<length:
        j=random.randint(0,i)
        arr[i],arr[j]=arr[j],arr[i]
        i+=1

这个随机算法对前半部分随机化程度很高(因为后半部分一共没随机几次啊哈哈哈)

采取的是交换随机法。

这样对这两个函数结合起来:

def quick_random_sort(arr):
    __random_list(arr)
    qsort(arr,0,len(arr))

无论什么序列都是O(nlgn)啦!

有人说你随机化一下差不多是n/2的时间,这不浪费了么?

可是啊,为了发挥出快速排序最强速度这还是值得的。因为综合起来时间依然是O(nlgn)!

还有人说如果给你一个几乎完全排序好的序列,你还给打乱了?

我只能说这个是没办法的,如果非要利用有序度来排序那么我推荐希尔排序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值