图示经典算法--自底向上的归并排序

自底向上的归并排序

自底向上的归并排序使用分治思想,将数组先两两归并,再四四归并,然后八八归并,直到整个数组有序。

class MergeBU(object):
    """docstring for MergeBU"""

    @classmethod
    def merge(cls, a, lo, mid, hi):
        # 将a[lo...hi]复制到aux[lo...hi]
        cls.aux[lo:hi + 1] = a[lo:hi + 1]
        i = lo
        j = mid + 1
        k = lo
        # 归并会a[lo...hi]
        while i <= mid and j <= hi:
            if cls.aux[i] < cls.aux[j]:
                a[k] = cls.aux[i]
                k += 1
                i += 1
            else:
                a[k] = cls.aux[j]
                k += 1
                j += 1
        n = mid + 1 - i
        a[k:k + n] = cls.aux[i:mid + 1]
        k += n
        n = hi + 1 - j
        a[k:k + n] = cls.aux[j:hi + 1]

    @classmethod
    def sort(cls, a):
        # lgN次两两归并
        n = len(a)
        cls.aux = [0] * n
        # sz子数组大小
        sz = 1
        while sz < n:
            # lo子数组索引
            lo = 0
            while lo < n - sz:
                cls.merge(a, lo, lo + sz - 1, min(lo + sz + sz - 1, n - 1))
                lo += (sz + sz)
            sz += sz

bottom_up_mergesort_tiny.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值