1. 程式人生 > >演算法訓練營(一):快速排序

演算法訓練營(一):快速排序

#/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倍。