数据结构与算法C++之归并排序(续)

本文介绍了一种自下而上的归并排序算法实现,通过迭代而非递归的方式完成排序过程,首先对数组的每个元素进行两两归并,然后逐步合并更大的有序数组,直至整个数组有序。

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

上一篇博客中实现的是自上以下的归并排序,自上而下需要先不断将数组进行对半拆分(递归实现),然后再合并排序
其实也可以自下而上实现归并排序,这样使用for循环就可以实现,省掉了递归的操作
首先对数组的每一个元素进行两两归并(相邻的两个元素合并成一个有序数组),然后将合并好的两个元素的有序数组再进行合并,合并成包含四个元素的有序数组,然后在此基础上,再合并成包含八个有序数组的元素,以此类推
程序实现为:

#include <iostream>

#ifndef _SORTINGHELP_H_
#define _SORTINGHELP_H_
#include "SortingHelp.h"
#endif // _SORTINGHELP_H_

using namespace std;

//将arr[l...mid]和arr[mid+1...r]两部分进行归并
template<typename T>
void __merge(T arr[], int l, int mid, int r){
    T aux[r-l+1];
    for (int i = l; i <= r; i++){
        aux[i-l] = arr[i];
    }

    int i = l, j = mid + 1;
    for (int k = l; k <= r; k++){
        if (i > mid){
            arr[k] = aux[j-l];
            j++;
        }
        else if (j > r){
            arr[k] = aux[i-l];
            i++;
        }

        else if (aux[i-l] < aux[j-l]){
            arr[k] = aux[i-l];
            i++;
        }
        else{
            arr[k] = aux[j-l];
            j++;
        }
    }
}

template<typename T>
void MergeSortingBU(T arr[], int n){
    for (int sz = 1; sz <= n; sz += sz){
        for (int i = 0; i + sz < n; i += sz + sz ){
            __merge(arr, i, i + sz - 1, min(i + sz + sz -1, n - 1));
        }
    }
}




//int main(){
//    int a[] = {10,9,8,6,6,5,5,3,2,1};
//    int n = 10;
//    MergeSortingBU(a, n);
//    for(int i = 0; i < n; i++){
//        cout<<a[i]<<" ";
//    }
//    cout<<endl;
//    return 0;
//}


int main()
{
    int n = 50000;
    int *arr = generateRandomArray(n, 0, n);
    int *arr2 = copyIntArray(arr, n);
    testSorting("InsertionSortingImproved", InsertionSortingImproved, arr, n);
    testSorting("MergeSortingBU", MergeSortingBU, arr2, n);
    delete[] arr;//最后删除数组开辟的空间
    delete[] arr2;
    return 0;
}

输出结果
在这里插入图片描述
运行另一个测试文件

int main(){
    int a[] = {10,9,8,6,6,5,5,3,2,1};
    int n = 10;
    MergeSortingBU(a, n);
    for(int i = 0; i < n; i++){
        cout<<a[i]<<" ";
    }
    cout<<endl;
    return 0;
}

输出为
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值