【发布时间】:2012-11-21 04:53:56
【问题描述】:
基于that answer,这里有两个版本的用于合并排序的合并函数。 你能帮我理解为什么第二个更快。 我已经测试了它的 50000 列表,第二个快 8 倍 (Gist)。
def merge1(left, right):
i = j = inv = 0
merged = []
while i < len(left) and j < len(right):
if left[i] <= right[j]:
merged.append(left[i])
i += 1
else:
merged.append(right[j])
j += 1
inv += len(left[i:])
merged += left[i:]
merged += right[j:]
return merged, inv
.
def merge2(array1, array2):
inv = 0
merged_array = []
while array1 or array2:
if not array1:
merged_array.append(array2.pop())
elif (not array2) or array1[-1] > array2[-1]:
merged_array.append(array1.pop())
inv += len(array2)
else:
merged_array.append(array2.pop())
merged_array.reverse()
return merged_array, inv
这里是排序函数:
def _merge_sort(list, merge):
len_list = len(list)
if len_list < 2:
return list, 0
middle = len_list / 2
left, left_inv = _merge_sort(list[:middle], merge)
right, right_inv = _merge_sort(list[middle:], merge)
l, merge_inv = merge(left, right)
inv = left_inv + right_inv + merge_inv
return l, inv
.
import numpy.random as nprnd
test_list = nprnd.randint(1000, size=50000).tolist()
test_list_tmp = list(test_list)
merge_sort(test_list_tmp, merge1)
test_list_tmp = list(test_list)
merge_sort(test_list_tmp, merge2)
【问题讨论】:
-
您这样做是为了教育目的,还是因为您想要快速排序?
-
@StevenRumbalski 我想了解这个问题。
-
@StevenRumbalski 你是对的,它是 'inv += len(left[i:])' 中的切片问题,该行减慢了函数的速度
-
改成
len(left) - i。