在PYTHON下写了个MERGESORT,代码如下:
import time
import random
def mergesort(l):
"""
l : list to be sorted
"""
if len(l) <= 1:
return l
else:
middle = int(len(l)/2)
left = mergesort(l[:middle])
right = mergesort(l[middle:])
return merge(left, right)
def merge(left, right):
# list l will be returned
l1 = []
# We do this because pop seems to be efficient at the end
while(len(left) != 0 and len(right) != 0):
left_element = left[0]
right_element = right[0]
if left_element <= right_element:
l1.append(left_element)
left.pop(0)
else:
l1.append(right_element)
right.pop(0)
# We quit the loop when one list becomes empty
if len(left) == 0:
l1 = l1 + right
else:
l1 = l1 + left
return l1
def main():
l = []
for i in range(200):
l.append(random.randrange(0, 1001))
starttime = time.clock()
l1 = mergesort(l)
endtime = time.clock()
print(endtime - starttime)
if __name__ == "__main__":
main()
由于python的LIST实在和c++的VECTOR很像(都有什么不同?没研究过。。。),所以很怀疑pop(0)的性能,重新写了一个merge function:
def merge(left, right):
# list l will be returned
l1 = []
index_left = 0
index_right = 0
len_left = len(left)
len_right = len(right)
# We do this because pop seems to be efficient at the end
while(index_left != len_left and index_right != len_right):
left_element = left[index_left]
right_element = right[index_right]
if left_element <= right_element:
l1.append(left_element)
index_left += 1
else:
l1.append(right_element)
index_right += 1
# We quit the loop when one list becomes empty
if index_left == len_left:
l1 = l1 + right[index_right:]
else:
l1 = l1 + left[index_left:]
return l1
时间上提高了一倍。