PAT A1089挿入またはマージ(25分)

トピックリンクhttps://pintia.cn/problem-sets/994805342720868352/problems/994805377432928256

タイトル説明
ウィキペディアによると:

挿入ソートの反復処理し、各反復1つの入力要素を消費し、ソートされた出力リストを成長させること。各反復は、挿入ソート入力データから一つの要素を削除し、それがソートされたリスト内に属する場所、およびそこに挿入があると認めます。何の入力要素が残っていないまで、それは繰り返されます。

マージソートのように動作する次のN個のサブリストにソートされていないリストを分割し、それぞれを含む1つの要素(1つの要素のリストがソートされたと見なされます)。そして、繰り返し、残りの1つだけのサブリストがあるまで新しいソートサブリストを生成するために2つの隣接するサブリストをマージします。

今、一緒にいくつかのソート方法のいくつかの繰り返しの結果であるシーケンスで、整数の初期シーケンスを与え、あなたは私たちが使っている方法を並べ替えている伝えることができますか?

输入
各入力ファイルは、1つのテストケースが含まれています。各場合について、最初の行は、N(≤100)整数陽性を与えます。そして、次の行では、N個の整数は最初のシーケンスとして与えられています。最後の行は、N個の数字の部分的にソートされた配列を含みます。標的配列が常に昇順であるとします。行のすべての数字は、スペースで区切られます。

输出
各テストケースについて、部分的な結果を得るために使用される方法を示すために「マージソート」の最初の行のいずれかで「ソート挿入」またはで印刷。そして、2行目の1回の以上の繰り返しと出力resulingシーケンスのために、この方法を実行します。答えは各テストケースに対して一意であることが保証されています。行のすべての数字は、スペースで区切る必要があり、ラインの末尾に余分なスペースがあってはなりません。

サンプル入力
10
。3 2 8 7 5 9 1 4 6 0
1 2 3 4 6 7 8 9 5 0

サンプル出力
挿入ソート
。1 2 4 3 5 6 7 8 9 0

コード

#include <cstdio>
#include <algorithm>
using namespace std;

const int N = 111;
int origin[N], tempOri[N], changed[N];
int n;

bool isSame(int A[], int B[]) {
	for(int i = 0; i < n; i++) {
		if(A[i] != B[i])
			return false;
	}
	return true;
}

void showArray(int A[]) {
	for(int i = 0; i < n; i++) {
		printf("%d", A[i]);
		if(i < n - 1)
			printf(" ");
	}
	printf("\n");
}

bool insertSort() {
	bool flag = false;
	for(int i = 1; i < n; i++) {
		if(i != 1 && isSame(tempOri, changed)) {
			flag = true;
		}
		int temp = tempOri[i], j = i;
		while(j > 0 && tempOri[j - 1] > temp) {
			tempOri[j] = tempOri[ j - 1];
			j--;
		}
		tempOri[j] = temp;
		if(flag)
			return true;
	}
	return false;
}

void mergeSort() {
	bool flag = false;
	for(int step = 2; step / 2 <= n; step *= 2) {
		if(step != 2 && isSame(tempOri, changed))
			flag = true;
		for(int i = 0; i < n; i += step)
			sort(tempOri + i, tempOri + min(i + step, n));
		if(flag == true) {
			showArray(tempOri);
			return;
		}

	}
}

int main() {
	scanf("%d", &n);
	for(int i = 0; i < n; i++) {
		scanf("%d", &origin[i]);
		tempOri[i] = origin[i];
	}
	for(int i = 0; i < n; i ++) {
		scanf("%d", &changed[i]);
	}
	if(insertSort()) {
		printf("Insertion Sort\n");
		showArray(tempOri);
	}
	else {
		printf("Merge Sort\n");
		for(int i = 0; i < n; i++)
			tempOri[i] = origin[i];
		mergeSort();
	}
	return 0;
}
公開された288元の記事 ウォン称賛12 ビュー20000 +

おすすめ

転載: blog.csdn.net/Rhao999/article/details/104843714