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

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

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

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

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

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)!

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

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

猜你喜欢

转载自blog.csdn.net/weixin_37373020/article/details/80383271