文章目錄
- Question
- Ideas
- Code
Question
給定你一個長度為 n
的整數數列。
請你使用歸并排序對這個數列按照從小到大進行排序。
并將排好序的數列按順序輸出。
輸入格式
輸入共兩行,第一行包含整數 n
。
第二行包含 n
個整數(所有整數均在 1~109
范圍內),表示整個數列。
輸出格式
輸出共一行,包含 n
個整數,表示排好序的數列。
數據范圍
1≤n≤100000
輸入樣例:
5
3 1 2 4 5
輸出樣例:
1 2 3 4 5
Ideas
Code
// 歸并排序步驟
// 1. 選取中間點
// 2. 遞歸左右區間
// 3. 合并兩個區間
#include <iostream>using namespace std;
const int N = 1e5 + 10;
int a[N], tem[N];void merge_sort(int *a, int l, int r)
{if (l >= r) return;int mid = l + r >> 1;merge_sort(a, l, mid), merge_sort(a, mid + 1, r);int i = l, j = mid + 1, k = 0;while(i <= mid && j <= r){if (a[i] <= a[j]) // 穩定tem[k ++] = a[i ++];elsetem[k ++] = a[j ++];}while(i <= mid){tem[k ++] = a[i ++];}while(j <= r){tem[k ++] = a[j ++];}for (int i = l, j = 0; i <= r; i ++){a[i] = tem[j ++ ];}
}
int main()
{int n;scanf("%d", &n);for (int i = 0; i < n; i ++) scanf("%d", &a[i]);merge_sort(a, 0, n - 1);for (int i = 0; i < n; i ++) printf("%d ", a[i]);return 0;
}