python实现归并排序

排序原理:
1、将数组不断拆分,直到个数为1
2、将相邻的两个子组进行合并成一个有序的大组

class Merge:
    def __init__(self):
        super(Merge, self).__init__()

    @staticmethod
    def sort(a):
        Merge._grouping(a, 0, len(a) - 1)

    @staticmethod
    def _grouping(a, start, end):
        # print(end, start)
        if end <= start:
            return
        mid = int(start + (end - start) / 2)
        Merge._grouping(a, start, mid)
        Merge._grouping(a, mid + 1, end)

        Merge.merge(a, start, mid, end)

    @staticmethod
    def merge(a, start, mid, end):
		# 创建一个辅助数组,初始化和a数组一样的大小
        c = [i for i in range(0, len(a))]

        index = start
        # 第一个子组的起始位置
        p1 = start
        # 第二个子组的起始位置
        p2 = mid + 1
        
        # 知道某一个子组遍历完就退出循环
        while (p1 <= mid) and (p2 <= end):
        	# 判断大小,然后放入辅助数组中,(和原数组相同的索引)
            if Merge.compare(a, p1, p2):
                c[index] = a[p2]
                p2 += 1
                index += 1
            else:
                c[index] = a[p1]
                p1 += 1
                index += 1
		# 遍历没遍历完的部分
        while p1 <= mid:
        	# 放入辅助数组中
            c[index] = a[p1]
            p1 += 1
            index += 1

        while p2 <= end:
            c[index] = a[p2]
            p2 += 1
            index += 1
		
		# 将排序完的部分复制回原数组
        for i in range(start, end+1):
            a[i] = c[i]


    @staticmethod
    def compare(a, i, j):
        if a[i] >= a[j]:
            return True
        return False


if __name__ == '__main__':
    shell = Merge()
    t = [1, 3, 2, 4, 0, 6, 5, 8, 7, 123, 1, 25, 3, 123]
    shell.sort(t)
    print(t)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值