資料結構與演算法C++之歸併排序(續)
阿新 • • 發佈:2018-11-14
上一篇部落格中實現的是自上以下的歸併排序,自上而下需要先不斷將陣列進行對半拆分(遞迴實現),然後再合併排序
其實也可以自下而上實現歸併排序,這樣使用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;
}
輸出為