归并排序(C++版)

最近正在看递归和分治法,归并排序是一种很经典的实例,妙处就在把整个数组不断二分割,直到分割出元素为止,然后在Merge对两个元素进行排序,可以将我写的实例给换掉,只调用merge函数,不调用merge_sort,如

int a[]={9,1};
//merge(a,p,q,r)
merge(a,0,0,1);
//然后打印出a,你就会发现归并排序的解是如何开始合并的

#include<iostream>
using namespace std;
//合并序列
void merge(int *arr,int p,int q,int r){
//创建两个临时数组a1,a2分别存放左序列arr[p,r],右序列arr[r+1,q]
int n1=q-p+1;
int n2=r-q;
int a1[n1];
int a2[n2];
for(int i=0;i<n1;i++){
    a1[i]=*(arr+p+i);
}
for(int i=0;i<n2;i++){

    a2[i]=*(arr+q+1+i);
}
//开始合并两个子序列,设置j和k两个自增量分别对应两个临时数组的下标
int j=0,k=0;
for(int i=p;i<r+1;i++)
        {

            if(a1[j]<=a2[k])
            {
              *(arr+i)=a1[j++];
            }else{
              *(arr+i)=a2[k++];
            }
        }

}
void merge_sort(int *arr,int p,int r)
{

    int q=(r+p)/2;
    if(p<r){
    merge_sort(arr,p,q);
    merge_sort(arr,q+1,r);
    merge(arr,p,q,r);
    }
}
int main(){

//测试用例
int a[]={9,8,7,6,5,4,3,2,1};
int n=sizeof(a)/sizeof(int);
merge_sort(a,0,n-1);
//测试用法
for(int i=0;i<n;i++){
    cout<<a[i];
}

}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值