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