#98 マージソート

レンプレート

	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

おすすめ

転載: blog.csdn.net/Seattle_night/article/details/129962681