归并排序算法的优化

本文介绍了归并排序算法在处理基本有序或完全有序数据时效率较低的问题,并提出了优化方案。优化方法是在数据量减小到一定程度时,提前结束递归,改用插入排序,以利用其在小规模数据上的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  上一篇讲到的归并排序算法,在待排序列基本有序或者完全有序的情况下进行测试,其时间性能比插入排序差很多,针对这种情况,对归并排序算法作出优化,先观察归并排序算法的代码:

template<typename T>
void __mergeSort(T arr[], int l, int r)  //一定要注意我设定的是左闭右闭[l...r](r是最后一个元素)
{
    //递归使用归并排序,对arr[l...r]进行归并
    //先考虑递归最底层
    if(l >= r)
    {
        return;
    }
    else
    {
        int mid = (l + r) / 2;
        //对左半部分arr[l...mid]进行归并排序
        __mergeSort(arr, l, mid);
        //再对右半部分arr[mid + 1...r]进行归并排序
        __mergeSort(arr, mid + 1, r);
        //然后将排好序的左右两部分归并到一起
        __merge(arr, l, mid, r);
    }
}
  可以看到,arr[l...mid]和arr[mid+1...r]分别完成归并排序后,程序不管这两部分组成的arr[l...r]是否有序就执行了__merge(arr, l, mid, r),若 arr[l...mid]和arr[mid+1...r]分别完成归并排序后,arr[mid] <= arr[mid+1],则整个序列就已经有序了,无需再执行下面的语句。所以若待排序序列可能会接近有序的情况下,对上述归并算法优化如下:

template<typename T>
void __mergeSort(T arr[], int l, int r)  
{
    if(l >= r)
    {
        return;
    }
    else
    {
        int mid = (l + r) / 2;
        __mergeSort(arr, l, mid);
        __mergeSort(arr, mid + 1, r);
        if(arr[mid] > arrr[mid + 1])
            __merge(arr, l, mid, r);
    }
}

  另一种优化方法是针对近乎所有的高级排序算法都可以使用的:就是针对递归到底的情况作出优化。现在是递归到底后返回上一层,但实际上,可以在递归到所剩数据量不大时,就停止递归,而对这部分数据采用插入排序算法(当数据量不大时,插入排序的时间性能比较好)。

  针对 if 语句采取的优化如下:

    if(r - l <= 15)  //即所剩元素数量为16时
    {
        insertionSort(arr, l, r);
        return;  //返回上一层
    }
  而insertionSort()的定义如下(它是对插入排序算法函数的重载):

template<typename T>
void insertionSort(T arr[], int l, int r)  //将arr[l...r]区间内的元素进行插入排序
{
    for(int i = l + 1; i <= r; i++)
    {
        T e = arr[i];
        int j;
        for(j = i; j > l && arr[j - 1] > e; j--)
        {
            arr[j] = arr[j - 1];
        }
        arr[j] = e;
    }
}
  
  采用 归并排序算法的main.cpp文件进行测试,可以发现优化过的归并排序算法的时间性能更优。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值