演算法筆記-問題 B: 基礎排序III:歸併排序
阿新 • • 發佈:2021-01-15
技術標籤:排序演算法
問題 B: 基礎排序III:歸併排序
題目描述
歸併排序是一個時間複雜度為O(nlogn)的演算法,對於大量資料遠遠優於氣泡排序與插入排序。
這是一道排序練習題,資料量較大,請使用歸併排序完成。
輸入
第一行一個數字n,代表輸入的組數
其後每組第一行輸入一個數字m,代表待排序數字的個數
其後m行每行一個數據,大小在1~100000之間,互不相等,最多有10萬個資料。
輸出
升序輸出排好序的資料,每行一個數字
樣例輸入Copy
1 10 10 9 8 7 6 5 4 3 2 1
樣例輸出 Copy
1 2 3 4 5 6 7 8 9 10
程式碼:
#include <bits/stdc++.h> using namespace std; void Merge(vector<int> &A, int L1, int R1, int L2, int R2){ int i = L1, j = L2; vector<int> temp(R2 - L1 + 10); int index = 0; while(i <= R1 && j <= R2){ if(A[i] <= A[j]){ temp[index++] = A[i++]; } else{ temp[index++] = A[j++]; } } while(i <= R1) temp[index++] = A[i++]; while(j <= R2) temp[index++] = A[j++]; for(i = 0; i < index; i++){ A[L1 + i] = temp[i]; } return; } void MergeSort(vector<int> &A, int left, int right){ if(left < right){ int mid = (left + right) / 2; MergeSort(A, left, mid); MergeSort(A, mid + 1, right); Merge(A, left, mid, mid + 1, right); } return; } int main() { int n; while(scanf("%d", &n)!=EOF){ while(n--){ int m; scanf("%d", &m); vector<int> nums; for(int i=0; i<m; i++){ int a; scanf("%d", &a); nums.push_back(a); } int left = 0, right = nums.size() - 1; MergeSort(nums, left, right); for(int i = 0; i < nums.size(); i++){ printf("%d\n", nums[i]); } } } return 0; }