归并排序

归并排序指的是将数据进行整合,重新分配一个空间出来,将空间分成两个部分,对每一个部分的数据从头到尾进行比较。每次比较的是两个值大小,谁小谁放在原始空间的位置,然后移出的值的序列号进行增加1的操作,继续下一个的比较。具体的方法如下

void __merge(T arr[], int l, int mid, int r){

    // 经测试,传递aux数组的性能效果并不好
    int aux[r-l+1];
    for( int i = l ; i <= r; i ++ )
        aux[i-l] = arr[i];

    int i=1,j=mid+1;
    for(int k=1;k<=r;k++){

    	if(i>mid) {arr[k]=aux[j-1];j++;}
    	else if(j>r) {arr[k]=aux[i-1];i++}
    	else if(aux[i-1]<aux[j-1]) {arr[k]=aux[i-1];j++;}
    	else {arr[k]=aux[j-1];j++;}

    }
}

void __mergesort(int arr[],int l,int r){

	if(l>=r)
		return;
	int mid=(l+r)/2;
	__mergesort(arr,1,mid);
	__mergesort(arr,mid+1,r);
	__merge(arr,1,mid,r);
}

void mergesort(int arr[],int n){
	__mergesort(arr,0,n-1);
}


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

	}
	count<<endl;
	return 0;
}


算法稍微复杂些,需要每天仔细的反复观察才可以的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值