归并排序

#include <iostream>
using namespace std;
//对数组a,下标范围在[ns,ne)的元素进行归并排序
void MergeSort(int*a,int ns,int ne);
void print(int*a,int n);
int main()
{
	int a[]={4,1,10,15,37,79,24,11,91,2,18,9,45,21,52,83,98,90};
	int n=sizeof(a)/sizeof(*a);
		MergeSort(a,0,n);
		print(a,n);
	return 0;
}
void print(int *a,int n)
{
	for(int i=0;i<n;i++)
		cout<<a[i]<<" ";
		cout<<endl;
}
void MergeSort(int*a,int ns,int ne)
{
//1.递归终止条件
//半开区间中只有1个元素,这时一定有序
	if(ne-ns==1)
		return;
//2.二分法,取中间位置
//对2个子数组进行分开排序
	int m=ns+(ne-ns)/2; //取中间位置
		MergeSort(a,ns,m); //左半区间归并排序 [ns,m)
		MergeSort(a,m,ne); //右半区间归并排序 [m,ne)
//3.合并
//1)依次取出子数组的元素,进行合并
		int *ta=new int[ne-ns];//定义一个临时数组
		int nl=ns,nr=m; //左半边的子数组和右边的子数组下标
		int nt=0; //临时数组的下标
			for(;;){
//左半区间[ns,m),右半区间[m,ne)
				if(nl>=m || nr>=ne)
					break;
				if(a[nl]<=a[nr]){ //左边的小
					ta[nt]=a[nl]; //取左边元素
					nl++; //左半部下标右移
					nt++; //临时数组的下标右移
					}
				else{ //右边的小
					ta[nt]=a[nr]; //取右边元素
						nr++; //右半部下标右移
						nt++; //临时数组的下标右移
						}
		}

老师整理的代码,用来参考

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值