def merge_sort(arr):
arr1 = []
arr2 = []
mid = int(len(arr)/2)
if len(arr) == 1:
return arr
elif len(arr) > 2:
arr1 = arr[0:mid]
arr2 = arr[mid:len(arr)]
return [merge_sort(arr1), merge_sort(arr2)]
elif len(arr) == 2:
if arr[0]>arr[1]:
temp = arr[0]
arr[0] = arr[1]
arr[1] = temp
return arr
我编写了此函数,该函数将列表递归地分成两部分,直到其长度至少为1或2。
如果列表的长度变为:
问题在于,运行此代码后,输出将以列表列表的形式出现,并且将它们合并似乎是一项艰巨的任务。
该代码为给定的调用生成以下输出:
merge_sort([5,4,1,8,7,2,6,3,9])
输出:
[[[4, 5], [1, 8]], [[2, 7], [[6], [3, 9]]]]
在“合并排序算法”中,您必须具有一个merge
函数,以便在合并的每个步骤中,对两个小部分进行排序。问题是,当数组大小为2时,您只是交换两个数字。
def merge(arr1,arr2):
it1 = 0
it2 = 0
ret = []
while it1 < len(arr1) or it2 < len(arr2):
if it1 == len(arr1):
ret.append(arr2[it2])
it2+=1
elif it2 == len(arr2):
ret.append(arr1[it1])
it1+=1
else:
if arr1[it1] > arr2[it2]:
ret.append(arr2[it2])
it2+=1
else:
ret.append(arr1[it1])
it1+=1
return ret
def merge_sort(arr):
arr1 = []
arr2 = []
mid = int(len(arr)/2)
if len(arr) == 1:
return arr
elif len(arr) > 2:
arr1 = arr[0:mid]
arr2 = arr[mid:len(arr)]
return merge(merge_sort(arr1), merge_sort(arr2))
elif len(arr) == 2:
if arr[0]>arr[1]:
temp = arr[0]
arr[0] = arr[1]
arr[1] = temp
return arr
PS。我只是做了一些小的修改就对您的代码进行了编辑。您可以以更好的方式和更整洁的方式编写“合并排序算法”。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句