归并排序

自顶而下

# coding=utf-8
###归并排序
class Merge:
    # 额外数组空间
    aux = []

    def sort(self, arr):
        self.aux = [0] * len(arr)
        self.sort0(arr, 0, len(arr) - 1)

    def sort0(self, arr, low, high):
        if low < high:
            mid = (low + high) // 2
            self.sort0(arr, low, mid)
            self.sort0(arr, mid + 1, high)
            self.merge(arr, low, mid, high)

    def merge(self, arr, low, mid, high):
        for i in range(low, high + 1):
            self.aux[i] = arr[i]
        i = low
        j = mid + 1
        # 原地归并
        for k in range(low, high + 1):
            if i > mid:
                arr[k] = self.aux[j]
                j += 1
            elif j > high:
                arr[k] = self.aux[i]
                i += 1
            elif self.aux[j] >= self.aux[i]:
                arr[k] = self.aux[i]
                i += 1
            else:
                arr[k] = self.aux[j]
                j += 1

自底而上

 def sortBu(self, arr):
        le = len(arr)
        self.aux = [0] * le ##初始化数据大小
        n = 1  # 子列表元素数量
        while n < le:
            for lo in range(0, le - n, 2*n):
                #print("low:"+str(lo))
                hi = min(lo + n + n - 1, le - 1)
                mid = lo + n - 1
                self.merge(arr, lo, mid, hi)
            n = n + n
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 数据结构与算法--归并排序 归并排序 归并排序基于一种称为“归并”的简单操作。比如考试可能会分年级排名和班级排名,...
    sunhaiyu阅读 916评论 0 6
  • 序言 上一篇文章我们已经讲完了插入排序,也就是说我的On^2 的算法基本就写完了,当然还有别的On^2 的算法,但...
    再见远洋阅读 1,689评论 0 3
  • 不知从什么时候起,我们会时时刻刻地关注他人的想法。在吃饭时,会想,他是不是够不到这盘菜;在办公时,会想,自己打字的...
    洛缦阅读 303评论 0 1
  • 设计原则: 少用继承,多用组合 类应该对扩展开放,对修改关闭 目录 本文的结构如下: 什么是装饰者模式 为什么要用...
    w1992wishes阅读 1,231评论 0 7
  • 智能手机一部,寥寥后期,模特一枚,一套随手拍(写真)就出炉了 1、借助道具 拍照片的时候,除了工作证件照,其他照片...
    橙笑笑阅读 354评论 2 6