演算法訓練營(一):快速排序
阿新 • • 發佈:2018-12-12
#/usr/bin/python
#coding:utf8
import random
import time
import copy
testlist = [6,1,2,7,9,3,4,5,10,8]
testlist = [6,1,2,7,9,3,4,5,10,8,2,11,8,1,13,2,6,1,8,0,4,2,3,7,9]
testlist = []
for i in range(10000):
num = random.randint(0,10000)
testlist.append(num)
testlist2 = copy.deepcopy(testlist)
def quicksort (start, end):
i = start
j = end
#第一步,設定一個哨兵。
pivot = testlist[start]
#第二步,前後的資料分別與哨兵進行對比,進行置換,最後結果是使左邊的都小於哨兵值,右邊都大於哨兵值。
while i < j:
#j從最後一個位置開始向前查詢,找到一個比哨兵小的元素.
if testlist[j] < pivot:
if testlist[i] > pivot:
testlist[j], testlist[ i] = testlist[i], testlist[j]
#i從第一個位置開始向後查詢,找到一個比哨兵大的元素.
else:
i = i + 1
#j從最後一個位置開始向前查詢,找到一個比哨兵小的元素.
else:
j = j - 1
#最後當i < j 不在成立,可以把哨兵與j進行交換,這樣哨兵就在數列的中間位置,前邊都比哨兵值小,後邊都比哨兵值大.
testlist[j], testlist[start] = testlist[start] , testlist[j]
#只要start比i大說明小於哨兵的一邊沒有排序完成,需要繼續對比,重複上述過程。
if start < i:
quicksort(start, i-1)
#只要end>j 說明大於哨兵的一邊沒有對比完成,需要繼續對比,重複上述過程。
if end > j:
quicksort(j+1, end)
return 0
#氣泡排序
def bubbleSort():
for i in range(len(testlist2)-1):
for j in range(i,len(testlist2)):
if testlist2[i] > testlist2[j]:
testlist2[i], testlist2[j] = testlist2[j], testlist2[i]
if __name__ == '__main__':
start = time.time()
quicksort(0, len(testlist)-1)
end = time.time()
#print testlist
print end-start
start = time.time()
bubbleSort()
end = time.time()
#print testlist2
print end-start
執行的結果如下:
➜ quicksort python sort.py
0.0577049255371
12.5943760872
結論:
在大量資料的情況下:10000個隨機資料的情況下,快排要比最普通的氣泡排序快樂將近280倍。