1. 程式人生 > >資料結構與演算法C++之歸併排序(續)

資料結構與演算法C++之歸併排序(續)

上一篇部落格中實現的是自上以下的歸併排序,自上而下需要先不斷將陣列進行對半拆分(遞迴實現),然後再合併排序
其實也可以自下而上實現歸併排序,這樣使用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;
}

輸出為
在這裡插入圖片描述