设待排文件 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)