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

设待排文件 F = ( R 1 R 2 . . . R n ) F=(R_1 R_2 ... R_n ) F=(R1R2...Rn) ,首先将每个记录 R i R_i Ri 看作一个子文件,然后通过 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)

猜你喜欢

转载自blog.csdn.net/qq_31622015/article/details/102660178