归并排序

#include<iostream>
//对数组a,下标范围在半开区间[ns,ne)的元素进行归并排序
using namespace std;
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,94,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]<<" "; 
} 

void MergeSort(int*a,int ns,int ne)
{
	if(ne-ns==1)//1.递归终止条件,因为这是半开区间,所以只有一个元素
	  return;
	 //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,i;//左边子数组和右边子数组的下标; 
	int nt=0;//临时数组的下标;
	for(i;;i++){
		if(nl>=m||nr>=ne)break;//结束标志 
		if(a[nl]<=a[nr])//左边小,取左边元素 
		{ ta[nt]=a[nl];
           nl++;//左半部分下标右移		  
		   nt++; //临时数组的下标也同时右移 
		} 
		else 
		{ ta[nt]=a[nr];
		   nr++;
		   nt++; 
		}
	 } 
	//2左,3右边谁未取完,放入临时数组
	while(nl<m) 
	  ta[nt++]=a[nl++];
	 while(nr<ne)
	  ta[nt++]=a[nr++]; 
	  //4.临时数组赋值给数组a
	  for(int i=0;i<ne-ns;i++)
	  a[ns+i]=ta[i];
	  //5.释放临时空间
	  delete[] ta;	
} 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值