【算法日积月累】5-自底向上的归并排序
下面我们使用一种全新的思路来实现归并排序算法。
由于少了递归,我们只保留了“合并两个有序”数组的代码。
def __merge_of_two_sorted_array(nums, left, mid, right):
for index in range(left, right + 1):
nums_for_compare[index] = nums[index]
i = left
j = mid + 1
for k in range(left, right + 1):
if i == mid + 1:
nums[k] = nums_for_compare[j]
j += 1
elif j > right:
nums[k] = nums_for_compare[i]
i += 1
elif nums_for_compare[i] < nums_for_compare[j]:
nums[k] = nums_for_compare[i]
i += 1
else:
assert nums_for_compare[i] >= nums_for_compare[j]
nums[k] = nums_for_compare[j]
j += 1
def merge_sort(nums):
l = len(nums)
global nums_for_compare
nums_for_compare = list(range(l))
sz = 1
# sz = 1, 2, 4, 8
while sz < l:
# left = 0, 2, 4, 6
left = 0
while left < l - sz:
__merge_of_two_sorted_array(nums, left, left + sz - 1, min(left + sz + sz - 1, l - 1))
left += 2 * sz
sz *= 2
说明:“自底向上”的归并排序,因为没有使用到数组元素能够快速索引这个特性,因此很适合于链表这种数据结构。为此我曾经写过一个 LeetCode 第 148 题题解,下面的图展示了这种思路。
当然,我觉得这道题的常规做法还是“自顶向下”的归并排序,使用分治的思想完成。