1. 程式人生 > 其它 >演算法筆記-問題 B: 基礎排序III:歸併排序

演算法筆記-問題 B: 基礎排序III:歸併排序

技術標籤:排序演算法

問題 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;
}