1. 程式人生 > >PAT B1035 插入與歸並 (25 分)

PAT B1035 插入與歸並 (25 分)

正整數 string 推薦 style pan 輸入 ng- 比較 lan

根據維基百科的定義:

插入排序是叠代算法,逐一獲得輸入數據,逐步產生有序的輸出序列。每步叠代中,算法從輸入序列中取出一元素,將之插入有序序列中正確的位置。如此叠代直到全部元素有序。

歸並排序進行如下叠代操作:首先將原始序列看成 N 個只包含 1 個元素的有序子序列,然後每次叠代歸並兩個相鄰的有序子序列,直到最後只剩下 1 個有序的序列。

現給定原始序列和由某排序算法產生的中間序列,請你判斷該算法究竟是哪種排序算法?

輸入格式:

輸入在第一行給出正整數 N (≤100);隨後一行給出原始序列的 N 個整數;最後一行給出由某排序算法產生的中間序列。這裏假設排序的目標序列是升序。數字間以空格分隔。

輸出格式:

首先在第 1 行中輸出Insertion Sort表示插入排序、或Merge Sort表示歸並排序;然後在第 2 行中輸出用該排序算法再叠代一輪的結果序列。題目保證每組測試的結果是唯一的。數字間以空格分隔,且行首尾不得有多余空格。

輸入樣例 1:

10
3 1 2 8 7 5 9 4 6 0
1 2 3 7 8 5 9 4 6 0

輸出樣例 1:

Insertion Sort
1 2 3 5 7 8 9 4 6 0

輸入樣例 2:

10
3 1 2 8 7 5 9 4 0 6
1 3 2 8 5 7 4 9 0 6

輸出樣例 2:

Merge Sort
1 2 3 8 4 5 7 9 0 6
#include <iostream>
#include 
<stdio.h> #include <algorithm> #include <string> #include <map> using namespace std; const int maxn = 100010; int main(){ int n; int pre[101], tar[101], tmp[101]; scanf("%d", &n); for (int i = 0; i < n; i++){ scanf("%d", &pre[i]); tmp[i] = pre[i]; }
for (int i = 0; i < n; i++){ scanf("%d", &tar[i]); } int i; for (i = 1; i < n; i++){ sort(tmp, tmp + i + 1); if (equal(tmp, tmp + n, tar)){ printf("Insertion Sort\n"); sort(tmp, tmp + i + 2); for (int j = 0; j < n; j++){ printf("%d", tmp[j]); if (j != n - 1)printf(" "); } system("pause"); return 0; } } for (i = 2; i < n; i=i*2){ for (int j = 0; j < n ; j+=i){ sort(pre + j, j + i < n ? pre + j + i : pre + n); if (equal(pre, pre + n, tar)){ printf("Merge Sort\n"); i = i * 2; for (int j = 0; j < n ; j += i){ sort(pre + j, j + i<n ? pre + j + i : pre + n); } for (int j = 0; j < n; j++){ printf("%d", pre[j]); if (j != n - 1)printf(" "); } system("pause"); return 0; } } } /* for (i = 2; i < n; i=i*2){ for (int j = 0; j*i < n ; j++){ sort(pre + j*i, (j +1)* i < n ? pre + (j +1)* i : pre + n); if (equal(pre, pre + n, tar)){ printf("Merge Sort\n"); i = i * 2; for (int j = 0;j*i < n ; j++){ sort(pre + j*i, (j +1)* i < n ? pre + (j +1)* i : pre + n); } for (int j = 0; j < n; j++){ printf("%d", pre[j]); if (j != n - 1)printf(" "); } system("pause"); return 0; } } } */ system("pause"); }

註意點:可以用 sort 和 equal 來判斷排序情況,要註意歸並排序不能越界,歸並寫法註釋的那種比較復雜,不推薦

PAT B1035 插入與歸並 (25 分)