第7章 排序(6)

7.5 归并排序

归并排序主要是二路归并排序。二路归并排序的基本思想是:将两个有序表合并为一个有序表。

假设顺序表中n个记录为n个长度为1的有序表,从第1个有序表开始,把相邻的两个有序表两两合并成一个有序表,得到n/2个长度为2的有序表。如此重复,最后得到一个长度为n的有序表。

Python Codes:

def __Merge(arr,start1,start2,end):
    while(start1<=end and start2<=end):
        if(arr[start1]>arr[start2] and start1<start2):
            val=arr[start2]
            for i in range(start2,start1,-1):
                arr[i]=arr[i-1]
            arr[start1]=val
            start2+=1
        else:
            start1+=1 

def MergeSort(arr):
    i=1
    while(i<len(arr)):
        for j in range(0,len(arr),2*i):
            start1=j
            start2=j+i
            end=j+2*i-1
            if end>=len(arr):
                end=len(arr)-1
            if start2<len(arr):
                __Merge(arr,start1,start2,end)
        i=2*i          
C++ Codes:

template<class T>
void Merge(T vec[],int length,int start1,int start2,int end)
{
	while(start1<start2&&start2<=end)
	{
		if(vec[start1]>vec[start2])
		{
			T val=vec[start2];
			for(int i=start2;i>start1;--i)
			{
				vec[i]=vec[i-1];
			}
			vec[start1]=val;
			++start2;
		}
		else
			++start1;
	}
}

template<class T>
void MergeSort(T vec[],int length)
{
	int i=1;
	while(i<length)
	{
		for(int j=0;j<length;j+=2*i)
		{
			int start1=j;
			int start2=i+j;
			int end=j+i*2-1;
			if(end>=length)
			{
				end=length-1;
			}
			if(start2<length)
			{
				Merge(vec,length,start1,start2,end);
			}
		}
		i*=2;
	}
}

二路归并排序的时间复杂度为O(nlog2 n).

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值