我想學習合併排序,但我不確定我是否正確。它的工作原理和我試圖優化這個例如與leftpop deques,但我仍然得到的時間比內置sorted()函數慢大約4倍。這是否應該發生?還是我錯過了一些明顯的瓶頸?蟒蛇Mergesort - 太慢?
import random
from time import time
from collections import deque
unsorted = [random.randint(0, 1000) for r in xrange(101101)]
def merge_sort(unsorted_list):
length = len(unsorted_list)
if length <= 1:
return unsorted_list
left = unsorted_list[:length/2]
right = unsorted_list[length/2:]
left_sorted = deque(merge_sort(left))
right_sorted = deque(merge_sort(right))
new = []
while left_sorted and right_sorted:
if left_sorted[0] < right_sorted[0]:
new.append(left_sorted.popleft())
if not left_sorted:
new += right_sorted
else:
new.append(right_sorted.popleft())
if not right_sorted:
new += left_sorted
return new
s = time()
print merge_sort(unsorted)
e = time()
print e - s
s = time()
print sorted(unsorted)
e = time()
print e - s
編輯:下面一個有點優化版本:
def merge_sort(unsorted_list):
length = len(unsorted_list)
if length <= 1:
return unsorted_list
left = unsorted_list[:length/2]
right = unsorted_list[length/2:]
left_sorted = deque(merge_sort(left))
right_sorted = deque(merge_sort(right))
new = []
new_append = new.append
left_pop = left_sorted.popleft
right_pop = right_sorted.popleft
while left_sorted and right_sorted:
if left_sorted[0] < right_sorted[0]:
new_append(left_pop())
else:
new_append(right_pop())
if not left_sorted:
new += right_sorted
if not right_sorted:
new += left_sorted
return new
比高度優化的內建C函數慢4倍。 –
該死的你是對的。我完全忘了CPython不是用Python編寫的。那麼,至少這裏是一些谷歌mergesort python的代碼。 – iknownothing
我投票結束這個問題作爲題外話,因爲這應該進入CodeReview.Stackexchange.com – Prune