快速排序非常快,不过最慢的时候也挺慢的。
这是一个依赖于随机化输入的算法。
所以我想了一招,来随机化这个输入,达到最棒的效果。
首先,普通的快速排序如下:
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)!
还有人说如果给你一个几乎完全排序好的序列,你还给打乱了?
我只能说这个是没办法的,如果非要利用有序度来排序那么我推荐希尔排序。