数据结构之归并排序

#include <iostream>

using namespace std;

//subArrLen为有序子数组的长度,
//一次二路归并排序后的有序子序列存于数组swap中
void Merge(int a[],int n,int swap[],int subArrLen)
{
    int l1=0;//第一个有序子数组下界为0
    int l2=0,u1=0,u2=0;
    int i=0,j=0;
    int m=0;
    while(l1+subArrLen<=n-1)
    {
        l2=l1+subArrLen;
        u1=l2-1;
        u2=(l2+subArrLen-1<=n-1)?l2+subArrLen-1:n-1;



        for(i=l1,j=l2;(i<=u1 && j<=u2);m++ )
        {
            if(a[i]<=a[j])
            {
                swap[m]=a[i];
                i++;
            }
            else
            {
                swap[m]=a[j];
                j++;
            }
        }

        while(i<=u1)
        {
            swap[m]=a[i];
            m++;
            i++;
        }

        while(j<=u2)
        {
            swap[m]=a[j];
            m++;
            j++;
        }

        l1=u2+1;
    }

    for(i=l1;i<n;i++,m++)
    {
        swap[m]=a[i];
    }
}

void MergeSort(int a[],int n)
{
    int *swap=new int[n];
    int subArrLen=1;
    while(subArrLen<n)
    {
        Merge(a,n,swap,subArrLen);
        for(int i=0;i<n;i++)
        {
            a[i]=swap[i];
        }
        subArrLen*=2;
    }
    delete []swap;
}

int main()
{
    int a[]={6,5,4,3,2,1};
    MergeSort(a,6);
    for(int i=0;i<6;i++)
    {
        cout<<a[i]<<' ';
    }
    cout<<endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值