我想构建分而治之的算法,该算法计算许多反转。这是我的代码,该代码基于merge-sort:
def merge_sort(array):
if len(array)<=1:
return array
mid = len(array)//2
left_array = merge_sort(array[:mid])
right_array = merge_sort(array[mid:])
res = merge(left_array,right_array)
return res
def merge(left_array, right_array):
global inversions
inversions = 0
result = []
i = j = 0
while i < len(left_array) and j < len(right_array):
if left_array[i] <= right_array[j]:
result.append(left_array[i])
i+=1
else:
result.append(right_array[j])
inversions += len(left_array[i:])
print(right_array[j],left_array[i])
j +=1
result.extend(left_array[i:])
result.extend(right_array[j:])
return result
test = [5 ,2 ,10 ,8 ,1 ,9 ,4 ,3 ,6 ,7]
#test = [1,3,5,2,4,6]
merge_sort(test)
inversions
就我而言,我有11岁,但应该是22岁。
例如,我们有一个数组[1,3,5,2,4,6]。通过分而治之的方法(合并排序),我们将该数组分为两部分。在第一步中,我们选择元素1作为最小的元素,将其插入新数组并从左侧数组中删除。第二步,最小的元素是2(右数组)。在这里,我们看到,在左侧数组中有2个元素。这意味着,我们有2个反演,其中涉及元素2。 主要思想是,如果我们从右边的元素中选择一个元素,则反转数=元素的数量,即在左侧数组中为lefr。
我已尝试在代码中实现此逻辑,但无法正常工作。你能帮我发现我的错误吗?