您的位置:首页 > 编程语言 > Python开发

python mergesort 小思考,请高手指点

2011-06-17 00:14 387 查看
在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

时间上提高了一倍。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: