最近摸了下pyhton,發現真心好用。寫下快排來練手。
import random
def partition(a,lo,hi):
i = lo
j = hi+1
v = a[lo]
while true:
while a[i]<=v:
i = i+1
if i == hi:
break
j = j-1
while a[j]>v:
j = j-1
if j == lo:
break
if i>=j:
break
a[i],a[j]=a[j],a[i]
a[lo],a[j] = a[j],a[lo]
return j
def quicksort(a,lo,hi):
if hi<=lo:
return
j = partition(a,lo,hi)
quicksort(a,lo,j-1)
quicksort(a,j+1,hi)
a =
for i in range(1000000):
quicksort(a,0,len(a)-1)
寫的時候很多小細節要注意,比如要注意切分中j的移動,任何一點對i和j不合適的改動都會導致錯誤。
100萬的資料時間是3.44223299616秒排序完成。
對比下選擇排序:1萬的資料在6.5秒內排序完成。100萬資料時間太長。
def selectionsort(a):
for i in range(len(a)):
for j in range(i,len(a)):
if a[i]>a[j]:
a[i],a[j]=a[j],a[i]
即使是簡單的快速排序也有多種改進方法:
1)存在很多重複元素的時候可以採用3路排序的方法,提高速度;
2)對小陣列排序,插入排序比快速排序更快,因為快速排序是遞迴的。
下面繼續修改**(加入小陣列用插入排序):
import random
import time
def partition(a,lo,hi):
i = lo
j = hi+1
v = a[lo]
while true:
while a[i]<=v:
i = i+1
if i == hi:
break
j = j-1
while a[j]>v:
j = j-1
if i>=j:
break
a[i],a[j]=a[j],a[i]
a[lo],a[j] = a[j],a[lo]
return j
def quicksort(a,lo,hi):
f hi>=lo+15:
j = partition(a,lo,hi)
quicksort(a,lo,j-1)
quicksort(a,j+1,hi)
else:
selectionsort(a,lo,hi)
def selectionsort(a,lo,hi):
for i in range(lo,hi+1):
for j in range(i,hi+1):
if a[i]>a[j]:
a[i],a[j]=a[j],a[i]
a =
for i in range(1000000):
start = time.clock()
quicksort(a,0,len(a)-1)
end = time.clock()
print end-start
print a[0:10]
100萬資料3.56445105976s完成,並沒有體現特別大的優勢,演算法書上說省15%左右的時間,還要仔細再研究下。
對多個重複的元素進行排序:
三相切分
import random
import time
def quick3sort(a,lo,hi):
if hi<=lo:
return
lt = lo
i = lo+1
gt = hi
v = a[lo]
while i<=gt:
if a[i]v:
a[i],a[gt] = a[gt],a[i]
gt =gt-1
else:
i = i+1
quick3sort(a,lo,lt-1)
quick3sort(a,gt+1,hi)
a =for i in range(1000000):
start = time.clock()
quick3sort(a,0,len(a)-1)
end = time.clock()
print end-start
print a[0:10]
100萬資料,範圍(1,100000000)。6.12628795802s完成。
三相切分基本思路是把資料分成小於v,等於v,大於v的三段。然後再對小於v和大於v的進行快速排序。
如果對相同元素多的資料比如(1:100)100萬組資料只在1.45126854664內完成。
(1:10)的資料只在0.754866314071內完成。
而對原始的quicksort要用3.83970068155,和範圍大的時間一樣。
實際上如果已知到鍵的種類,桶排序是最快的,它只需要o(n)的演算法複雜度。
python快速排序排序 python快速排序
import random def rand n for i in range n yield random.randint 0,1000 建立乙個隨機數列表 def createlist n lists for i in rand n return lists 挖坑法快速排序 def quick ...
排序 快速排序 Python
快速排序 快排 是非常常用的排序方法,在技術面試中出現頻率也特別高。它主要採用交換和分治的策略進行排序。是不穩定排序。步驟 1 在序列中選乙個元素作為劃分的基準元素 pivot 2 將所有不大於pivot的數字放在pivot的前面,大於pivot的數字放在pivot的後面 3 以pivot為界,對前...
python快速排序
coding utf 8 class quicksort def sort self,list,left,right 開始位置小於 位置 if left 取到中間的乙個下標值 s list left right 2 i 0 i left j 下標結束 j right while true 從開始位置...