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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/majinlei121/article/details/83858402

上一篇博客中实现的是自上以下的归并排序,自上而下需要先不断将数组进行对半拆分(递归实现),然后再合并排序
其实也可以自下而上实现归并排序,这样使用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;
}

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

猜你喜欢

转载自blog.csdn.net/majinlei121/article/details/83858402
今日推荐