排序算法之归并排序

/*归并排序,归并排序依赖于归并操作,归并操作是指将两个已经有序的序列合并成一个有序序列的操作*/
//最坏时间复杂度NlogN,但是需要线性附加内存!!!
算法描述:
1、申请用来存放合并后的序列的空间,大小为两个已经有序序列之和
2、设定两个指针,初始指向两个有序序列的起始位置
3、比较两个指针所指向的元素,将较小的放入到合并空间,并将该指针移到下一个位置
4、重复3直到某一个指针到达尾部
5、将另一序列剩下的元素全部放到合并序列尾部

C++实现,时间复杂度O(nlogn),空间复杂度O(n),稳定

//将两个有序数组合并为一个有序数组
void Merge(int *pData,int *tempArray,int Lpos,int Rpos,int RightEnd)
{
	int LeftEnd = Rpos-1, tempPos = Lpos, num = RightEnd-Lpos+1;

	while(Lpos<=LeftEnd && Rpos<=RightEnd)
	{
		if(pData[Lpos]<=pData[Rpos])
			tempArray[tempPos++] = pData[Lpos++];
		else
			tempArray[tempPos++] = pData[Rpos++];
	}

	while(Lpos<=LeftEnd)   //拷贝前半部分剩下的元素
		tempArray[tempPos++] = pData[Lpos++];
	while(Rpos<=RightEnd)   //拷贝后半部分剩下的元素
		tempArray[tempPos++] = pData[Rpos++];

	for(int i=0;i<num;i++,RightEnd--)   //需要考虑中间某一次调用Merge的情况
		pData[RightEnd] = tempArray[RightEnd];
}

void MSort(int *pData,int *temp,int left,int right)
{
	int center;
	if(left<right)
	{
		center = (left+right)/2;
		MSort(pData,temp,left,center);   //对前半部分排序
		MSort(pData,temp,center+1,right);   //对后半部分排序
		Merge(pData,temp,left,center+1,right);   //合并
	}
}
//接口匹配Sort(int *pData, int count)
void MergeSort(int *pData, int count)
{
	int *temp = new int[count];   //线性空间开销
	
	MSort(pData,temp,0,count-1);
	delete []temp;
}

Python实现

def merge(leftArray,rightArray):
	temp=[]
	lPos,rPos=0,0
	while lPos<len(leftArray) and rPos<len(rightArray):
		if leftArray[lPos]<=rightArray[rPos]:
			temp.append(leftArray[lPos])
			lPos +=1
		else:
			temp.append(rightArray[rPos])
			rPos +=1
	temp +=leftArray[lPos:]
	temp +=rightArray[rPos:]
	return temp
def MergeSort(pData):
	if len(pData)<=1:
		return pData
	center=int(len(pData)/2)
	leftArray=MergeSort(pData[:center])
	rightArray=MergeSort(pData[center:])
	return merge(leftArray,rightArray)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值