归并排序

#include <stdio.h>
#include <stdlib.h>

void MergeSort(int *a,int ns,int ne)
{
	//1.递归终止条件 
    if(ne-ns==1) return ;
    //2.二分法,取中间位置,分开排序 
    int m=ns+(ne-ns)/2;
	MergeSort(a,ns,m) ;
	MergeSort(a,m,ne) ;	
	//3.合并 
	int *ta=new int[ne-ns] ;
	int nl=ns,nr=m;
	int nt=0; 
	
	for(;;){
	 	if(nl>=m || nr>=ne)  break;
		if(a[nl]<=a[nr])   {ta[nt]=a[nl];nl++;nt++; } 
		else  {ta[nt]=a[nr];nr++;nt++; }
	} 
	//如果左半区间或右半区间没取完 ,放到临时数组中 
	while(nl<m)  ta[nt++]=a[nl++];
	while(nr<ne)  ta[nt++]=a[nr++];
	//临时数组赋值到数组a 
	for(int i=0;i<ne-ns;i++)
		a[ns+i]=ta[i];
	//释放临时数组	
	delete[] ta ; 
}
int main()
{
    int a[]={8,3,6,2,5,7,9,1,4,0};
    int n=sizeof(a)/sizeof(int); 
    MergeSort(a,0,n);
    for(int i=0;i<10;i++)
        printf("%d ",a[i]);
    return 0;
}

int main()
{
    int a[]={8,3,6,2,5,7,9,1,4,0};
    MergeSort(a,0,9);
    for(int i=0;i<10;i++)
        printf("%d ",a[i]);
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值