← 返回内容列表

自底向上归并排序:不用递归的迭代版

分享本文
自底向上归并排序:不用递归的迭代版

先合并长度为 1 的有序段,再 2、4、8… 段长翻倍,趟数 ⌈log₂n⌉,免递归栈。

自底向上版不用递归,直接从长度为 1 的有序段开始,两两合并,段长不断翻倍。

自底向上归并:先合并长度 1,再 2、4、8…第1趟 宽=1[5,2] [4,6] [1,3] [2,8]第2趟 宽=2[2,4,5,6] [1,2,3,8]第3趟 宽=4[1,2,2,3,4,5,6,8]每趟把相邻有序段两两合并,段长翻倍段1段1段1段1段1段1段1段1宽=1段2段2段2段2宽=2段4段4宽=4趟数 = ⌈log₂n⌉,每趟 O(n) → 同样 Θ(n log n),且免递归栈

图:迭代版归并——段长 1→2→4→… 两两合并

def merge_sort_bottom_up(arr):
    n = len(arr)
    width = 1
    while width < n:
        for lo in range(0, n, 2*width):
            mid = min(lo+width, n)
            hi = min(lo+2*width, n)
            arr[lo:hi] = merge(arr[lo:mid], arr[mid:hi])
        width *= 2
    return arr

趟数 = ⌈log₂n⌉,每趟处理全部 n 个元素,总复杂度仍 Θ(n log n),且避免递归栈,空间更可控。

相关推荐:插入排序(也是迭代) · 分治思想

评论 (0)

正文划词可点「问萝卜特」——自动发评论并由 AI 回复

加载评论中…