归并排序

归并排序:

  归并排序的核心思想是采用分治法,对已有序的子序列进行合并,从而得到一个有序的序列。

例如:两个已经有序的子序列:2,4,6,8与3,5,7,首先首元素也就是2与3比较,2小于3,把2放到最终的序列中,然后拿第一个序列中的4再与3比较,4大于3,于是把3放入最终的序列中,重复以上过程最终当把7放入最终的序列之后,第一个序列中还有8未放入,将8放入最终的子序列,归并结束,已成为一个有序的序列:2,3,4,5,6,7,8

   

void mergeData(int a[],int lenA,int b[],int lenB,int temp[])
{

    int i=0;
    int j=0;
    int k=0;
    while(i<=lenA&&j<=lenB){

        if(a[i]>=b[j]){
          
         temp[k++]=b[j++];
        }
        else{

            temp[k++]=a[i++];
        }
    }
    while(i<=lenA){
        temp[k++]=a[i++];
    }
    while(j<=lenB){
        temp[k++]=a[j++];
    }
}

整个归并排序的过程一般使用递归来实现,首先将一个数组中的元素两两归并,成为若干个有序的子序列,再将这些子序列继续归并,得到最终的有序序列。

例如:4 3 5 2 7 8
第一次归并:(3 4) (2  5)(7 8)
第二次归并:(2 3 4 5)(7 8)
第三次归并: (2 3 4 5 7 8)

排序完成。
void mergeData(int data[],int first,int mid,int last,int temp[])
{

    int i=first;
    int j=mid+1;
    int m=mid,n=last;
    int k=0;
    while(i<=m&&j<=n){

        if(data[i]>=data[j]){
          
         temp[k++]=data[j++];
        }
        else{

            temp[k++]=data[i++];
        }
    }
    while(i<=m){
        temp[k++]=data[i++];
    }
    while(j<=n){
        temp[k++]=data[j++];
    }

    for(i=0;i
    
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值