二路归并排序递归实现和非递归实现

二路归并排序递归实现

#include<cstdio>
#include<algorithm>
using namespace std;

const int maxn = 100;
//将数组A的[L1,R1]与[L2,R2]区间合并为有序区间(此处L2即为R1+1) 
void merge(int A[],int L1,int R1,int L2,int R2){
	int i=L1,j=L2;	//i指向A[L1],j指向A[L2]
	int temp[maxn],index = 0;	//temp临时存放合并后的数组,index为其下标
	while(i<=R1 && j<=R2){
		if(A[i]<=A[j]){
			temp[index++] = A[i++];	//将A[i]加入序列temp 
		}else{
			temp[index++] = A[j++];	//将A[j]加入序列temp 
		}
	} 
	while(i<=R1) temp[index++] = A[i++]; //将[L1,R1]的剩余元素加入序列temp
	while(j<=R2) temp[index++] = A[j++];	//将[L2,R2]的剩余元素加入序列temp
	for(i = 0;i<index;i++){
		A[L1+i] = temp[i];	//将合并后的序列赋值回数组A 
	} 
}

//将array数组当前区间[left,right]进行归并排序 
void mergeSort(int A[],int left,int right){
	if(left<right){
		int mid = (left+right)/2; //取[left,right]的中点 
		mergeSort(A,left,mid);	//递归,将左子区间[left,mid]归并排序 
		mergeSort(A,mid+1,right);	//递归,将右子区间[mid+1,right]归并排序 
		merge(A,left,mid,mid+1,right);	//将右子区间和右子区间合并 
	}
}

二路归并排序非递归实现

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值