【发布时间】:2016-11-06 03:17:38
【问题描述】:
我是一个为了好玩而学习算法的初学者,我正在尝试在 Python 中实现归并排序。
以下是我的实现。当我向它提供 100000 个列表时,它非常慢。
def mergesortedlist(L, R):
LR = [0]*(len(L)+len(R)) ##merged output (LR combined)
i= 0 ##counter for left side
j= 0 ##counter for ride side
k = 0
while i <= len(L) and j <= len(R):
if i == len(L):
LR[k:]= R[j:]
return LR
elif j == len(R):
LR[k:] = L[i:]
return LR
elif L[i] < R[j]:
LR[k]= L[i]
i+=1
k+=1
else: ##left side is bigger than right side
LR[k]=R[j]
j+=1
k+=1
def mergesort(N):
if len(N) <= 1:
return N
else:
sub1 = N[0:round(len(N)/2)]
sub2 = N[round(len(N)/2):]
return mergesortedlist(mergesort(sub1), mergesort(sub2))
这是我在本网站 (http://interactivepython.org/courselib/static/pythonds/SortSearch/TheMergeSort.html) 的某处在线找到的实现
def mergeSort(alist):
print("Splitting ",alist)
if len(alist)>1:
mid = len(alist)//2
lefthalf = alist[:mid]
righthalf = alist[mid:]
mergeSort(lefthalf)
mergeSort(righthalf)
i=0
j=0
k=0
while i < len(lefthalf) and j < len(righthalf):
if lefthalf[i] < righthalf[j]:
alist[k]=lefthalf[i]
i=i+1
else:
alist[k]=righthalf[j]
j=j+1
k=k+1
while i < len(lefthalf):
alist[k]=lefthalf[i]
i=i+1
k=k+1
while j < len(righthalf):
alist[k]=righthalf[j]
j=j+1
k=k+1
print("Merging ",alist)
alist = [54,26,93,17,77,31,44,55,20]
mergeSort(alist)
print(alist)
速度非常快。
据我所知,我的实现也是 O(Nlog(N)),那为什么我的慢得多?
感谢您的帮助。
干杯!
【问题讨论】:
-
您能说明您是如何衡量性能差异的吗?
标签: python performance sorting mergesort