【Algorithm】排序之 “归并排序” 原理+python实现

本文详细介绍了二路归并排序算法的实现过程,包括如何将待排序的记录两两归并,逐步构建出完全有序的文件。通过具体的Python代码示例,展示了算法的分步实现,从相邻子文件的归并到整个文件的排序。

设待排文件 F=(R1R2...Rn)F=(R_1 R_2 ... R_n )F=(R1R2...Rn) ,首先将每个记录 RiR_iRi 看作一个子文件,然后通过 key的比较两两归并,得到 [n/2] 个长度为 2的有序子文件,再两两归并… 直到得到一个长度为n 的有序文件为止

在这里插入图片描述

实现(分三个函数):

  • 相邻两个字文件的归并
  • 对源文件的一趟二路归并
  • 源文件的二路归并排序

都写完之后可以合并合并,分三个函数主要是为了便于理解

在这里插入图片描述

class Solution:
    def __init__(self):
        self.count=0

    def Tmerge(self, file1,start,mid,end):
        file2=[]
        i=start
        j=mid+1

        while i<=mid and j<=end:
            if file1[i]<= file1[j]:
                file2.append(file1[i])
                i=i+1
            else:
                file2.append(file1[j])
                j=j+1
        while i<=mid:
            file2.append(file1[i])
            i=i+1
        while j<=end:
            file2.append(file1[j])
            j=j+1
        return file2


    def Mergesort(self,data):
        stride=1
        while stride<len(data):# 二路归并排序
            i=0
            while i+2*stride<=len(data):# 一趟二路归并排序
                print(i,i+2*stride)
                data[i:i+2*stride]=self.Tmerge(data,i,i+stride-1,i+2*stride-1)#相邻两个子文件归并
                print(data)
                i=i+2*stride
            if i+stride<len(data):
                data[i:len(data)]=self.Tmerge(data,i,i+stride-1,len(data)-1)
            stride=stride*2
        return data



if __name__ == '__main__':



    n=[1,2,4,3,5,6,7,0]
    n=[1,2,4,3,5,6,0]
    n=[3,1,2]
    # n=[]
    file1=[5,6,8,0,7,1,3]

    task=Solution()
    # t=task.Tmerge(file1,0,2,4)
    # t=task.mpass(file1,1)
    # t=task.mpass(t,2)
    t=task.Mergesort(file1)
    print(t)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值