レンプレート
void merge_sort_my(int q[], int l, int r) {
if (l>=r) return;
//分别递归对左半边、右半边排序
int i=l, mid=(l+r)>>1, j=mid+1, k=0;
merge_sort_my(q, l, mid);
merge_sort_my(q, j, r);
while (i<=mid && j<=r) //双指针均向右扫描,较小的元素放入到tmp中
if (q[i]<=q[j]) tmp[k++] = q[i++];
else tmp[k++] = q[j++];
while (i<=mid) tmp[k++] = q[i++]; //剩余的部分追加到tmp
while (j<=r) tmp[k++] = q[j++];
for (i=l,j=0; i<=r; ) q[i++] = tmp[j++];
}
アルゴリズム思考
1. 配列 q をソートします。左の境界は l、右の境界は r、mid=(l+r)/2
2. q[l,mid]の左半分とq[mid+1,r]の右半分を再帰的にソートします。
3. i=1、j=mid+1、それぞれ左半分と右半分をスキャンするために使用されます。
q[i] と q[j] を比較し、小さい方の要素を tmp[] に入れ、i>=mid または j>=r になるまでポインタを前方に移動します。
4. i=mid の場合、j は r より小さい可能性があります (右半分はスキャンされておらず、残りの部分はインクリメントされます)。
j=r の場合、i はmid より小さい可能性があります (左半分はスキャンされず、残りの部分はインクリメントされます)。
残りを tmp[] に追加します。
問題の説明
長さ n の整数の配列が与えられます。
マージ ソートを使用して、この配列を最小から最大の順に並べ替えてください。
そしてソートされた配列を順番に出力します。
入力フォーマット
入力は 2 行で構成され、最初の行には整数 n が含まれます。
2 行目には n 個の整数 (1 〜 1e+10 の範囲のすべての整数) が含まれており、シーケンス全体を表します。
出力フォーマット
出力は合計 1 行で、ソートされたシーケンスを表す n 個の整数が含まれます。
データ範囲
1≤n≤100000
入力サンプル:
5 3 1 2 4 5
出力例:
1 2 3 4 5