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
时间上提高了一倍。
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
时间上提高了一倍。
相关文章推荐
- 归并排序(MergeSort)的原理及延伸性思考
- mergesort in python
- 归并排序(MergeSort)的原理及延伸性思考
- insertion mergesort bubble sort 复习 python
- 4000 【数据结构笔记】归并排序(merge_sort)-- python2.7
- Python中的排序方法(Bubble Sort,Insert Sort,Select Sort,Merge Sort,Quick Sort)
- [building block] merge sort @ Python
- 归并排序(MergeSort)的原理及延伸性思考
- Merge sort with python
- [算法导论]merge sort @ Python
- python的归并排序(mergesort)实现
- Python: sort,sorted,OrderedDict的用法
- 望SQLServer 高手指点
- Linux下用python对文件内容按列进行排序-功能等同于Linux下的sort命令对文件内容进行排序
- jquery工具:$.each,grep,map, inArray,merge,unique,uniqueSort,contains,type.....
- 冒泡排序(方法名:bubbleSort) 与 归并排序(mergeSort)
- 第三周作业——冒泡排序(BubbleSort)与归并排序(MergeSort)
- 算法第三次作业(1. 排序。对文件 largeW.txt(下载链接)中的数据,编程实现冒泡排序(方法名:bubbleSort) 与 归并排序(mergeSort),把排序后的结果分别保存到largeW
- python 排序总结reverse sort sorted
- python sort、sort_index方法(排序)