【发布时间】:2021-06-04 11:46:57
【问题描述】:
我正在尝试编写一个 MergeSort 函数,它将数组拆分为 4 个数组,而不是像常规的 MergeSort 那样分成 2 个数组。
我尝试遵循 2-way mergeSort 并将其实现到 4-way 但我一直卡在递归调用中,我不明白问题出在哪里..
我编写了一个调用自身 4 次的 merge_sort_4 函数和应该合并 4 个数组而不是 2 个数组的 merge4 函数。
我知道我班上的一些人通过 3 次调用常规 Merge 函数解决了这个问题,但我认为这有点忽略了这个挑战的重点..
如果解决的唯一方法是使用常规合并,请告诉我,如果不是,请帮我找出问题
这是我的代码
def merge_sort_4(lst, start, end):
if start < end:
quarter1 = (start + end) // 4
quarter2 = (start + end) // 2
quarter3 = (end - quarter1 - 1)
merge_sort_4(lst, start, quarter1)
merge_sort_4(lst, quarter1 + 1, quarter2)
merge_sort_4(lst, quarter2 + 1, quarter3)
merge_sort_4(lst, quarter3 + 1, end)
merge4(lst, start, quarter1, quarter2, quarter3, end)
def merge4(lst, start, q1, q2, q3, end):
first_q_list = lst[start:q1 + 1]
sec_q_list = lst[q1 + 1:q2 + 1]
third_q_list = lst[q2 + 1:q3 + 1]
last_q_list = lst[q3 + 1:end + 1]
first_q_list.append(float('inf'))
sec_q_list.append(float('inf'))
third_q_list.append(float('inf'))
last_q_list.append(float('inf'))
i = 0 # first sublist index
j = 0 # sec sublist index
m = 0 # third sublist index
n = 0 # last sublist index
for k in range(start, end + 1):
if first_q_list[i] <= sec_q_list[j] and first_q_list[i] <= third_q_list[m] and first_q_list[i] <= last_q_list[
n]:
lst[k] = first_q_list[i]
i += 1
elif sec_q_list[j] <= third_q_list[m] and sec_q_list[j] <= last_q_list[n]:
lst[k] = sec_q_list[j]
j += 1
elif third_q_list[m] <= last_q_list[n]:
lst[k] = third_q_list[m]
m += 1
else:
lst[k] = last_q_list[n]
n += 1
提前感谢您的帮助!
【问题讨论】:
-
到目前为止您尝试过什么?你怎么知道它不起作用?您是否浏览过代码或单独测试过任何部分?您对可能出现的问题有任何怀疑吗?
标签: python sorting mergesort array-merge