归并排序

对已有两段排好序的数组进行排序
依次比较两数组元素大小然后放入大数组中

在这里插入图片描述
在这里插入图片描述
既然如此,那我们先将左右子数组进行内部排序,其后对左右子数组整体进行排序

//归并:对于左右已经排好序的一列数组(需要先解决左右两截的排序问题) 
void merge(int *a,int L,int M,int R){//合并
	int left_size=M-L; 
	int right_size=R-M+1;
	int left[left_size];//开一个左数组,存放左边一截排序好的数
	int right[right_size];//开一个右数组,存放右边一截排序好的数
	int i,j,k;
	//开始写入左数组 
	for(i=L;i<M;i++){
		left[i-L]=a[i];
	} 
	//开始写入右数组
	for(i=M;i<=R;i++){
		right[i-M]=a[i];
	} 
	//开始合并到原数组 
	i=0;j=0;k=L;
	while(i<left_size&&j<right_size){
		if(left[i]<right[j]){
			a[k]=left[i];
			i++;
			k++;
		}
		else {
			a[k]=right[j];
			j++;
			k++;
		}
	}
	while(i<left_size){
		a[k]=left[i];
		i++;
		k++;
	}
	while(j<right_size){
		a[k]=right[j];
		j++;
		k++;
	}
	return;
}

在合并之前,我们需要解决两个分数组的排序:
即对左边进行合并,再对右边进行合并(递归)

void mergesort(int *a,int L,int R){//归并排序 (递归) 
	if(L==R){
		return;
	}
	else {
		int M=(L+R)/2;
		mergesort(a,L,M);//排序左边 
		mergesort(a,M+1,R);//排序右边 
		merge(a,L,M+1,R); //合并排序
	}
	return;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值