几种排序分享--归并排序

归并排序


(这里参考自 狄泰 数据结构课程)

  1. 基本思想
    将两个或两个以上的有序序列合并成一个有序序列 意思就是
    V[ 0 ] , V[ 1 ] , V[ 02] ,…V[ m ] 和 V[ m ] , V[ m+1 ] , V[ m+2] ,…V[ n-1 ]
    合并 为 V[ 0 ] , V[ 1 ] , V[ 02]…V[ n-1 ]
    看下图 举例:
    在这里插入图片描述
  2. 直接上代码:

template <typename T>
void Sort::Merge(T array[], int len, bool min2max)	//对外使用接口
{
    T* helper = new T[len];	//使用辅助数组
    if(helper != NULL)
        Merge(array, helper, 0, len-1, min2max);
    delete helper;
}
template <typename T>
void Sort::Merge(T src[], T helper[], int begin, int end, bool min2max)
{
    if(begin == end)	//这里是递归出口当下标相等说明已经到最底层
    {
        return;
    }
    else
    {
        int mid = (begin + end)/2;	//将数组分成两部分
        Merge(src, helper, begin, mid, min2max);	//左边数组
        Merge(src, helper, mid+1, end, min2max);	//右边数组
        Merge(src, helper, begin, mid, end, min2max);	//两边数组合并
    }
}
template <typename T>
void Sort::Merge(T src[], T helper[], int begin, int mid, int end, bool min2max)
{
    int i = begin, j = mid+1, k = begin;


    while((i <= mid) && (j <= end))
    {
       if(min2max ? (src[i] < src[j]) : (src[i] > src[j]))
            helper[k++] = src[i++];	//将符合条件的元素放进辅助数组中
       else
            helper[k++] = src[j++];
    }


    while(i <= mid)	//当一边数组的元素个数多于另一边,将剩余的元素放入辅助数组
        helper[k++] = src[i++];
    while(j <= end)
        helper[k++] = src[j++];


    /*
     * 将排好序的数组拷贝回 src 是因为返回上一层递归后再利用 src 合并
    */
    for(i = begin; i <= end; i++)
    {
        src[i] = helper[i];
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值