PAT 乙級 1035 插入與歸併 25分

2021-10-21 12:34:26 字數 1885 閱讀 7707

我的個人** 

部落格** blog/blog/243

歡迎交換友鏈 :-)

根據維基百科的定義:

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

歸併排序進行如下迭代操作:首先將原始序列看成 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

思路:

例如樣式2中,的排序

1. , , , ,

2. , ,

3. ,

4. 簡單來說就是將陣列分為k=2個組,然後分為k *= 2個組...

此題用sort排序即可,只需了解原理,具體**不需要使用

如何區分insertion sort和merge sort?

由於題目性質,提供的陣列不可能一次運算就排序成功,這樣就無法判斷排序方式了

merge sort在排序中是分組排序,必定會有兩處b[i]>b[i+1],而insertion sort只有一處b[i]>b[i+1],而且此處之後的陣列必然和原陣列相同,我們可以找出第一處b[i]>b[i+1],然後檢視後面的陣列是否全部相同

如何繼續一次排序?

insertion sort只需多sort一位即可

merge sort需要將a按原理運算(用sort函式即可),等到a全部等於b時,再運算一次即可

**:

#include using namespace std;

int main() 

}int flag = 0;// 1 -> merge sort, 0 -> insertion sort

for (int i=temp+1; i}

if (flag) 

}k *= 2;

for (int i=0; i//  注意餘下的數

sort(a+n/k*k, a+n);}}

else 

for (int i=0; iprintf("%d\n", a[n-1]);

return 0;

}

PAT 乙級 1035 插入與歸併

1.題目描述 根據維基百科的定義 插入排序是迭代演算法,逐一獲得輸入資料,逐步產生有序的輸出序列。每步迭代中,演算法從輸入序列中取出一元素,將之插入有序序列中正確的位置。如此迭代直到全部元素有序。歸併排序進行如下迭代操作 首先將原始序列看成n個只包含1個元素的有序子串行,然後每次迭代歸併兩個相鄰的有...

PAT乙級 1035 插入與歸併

根據維基百科的定義 插入排序是迭代演算法,逐一獲得輸入資料,逐步產生有序的輸出序列。每步迭代中,演算法從輸入序列中取出一元素,將之插入有序序列中正確的位置。如此迭代直到全部元素有序。歸併排序進行如下迭代操作 首先將原始序列看成 n 個只包含 1 個元素的有序子串行,然後每次迭代歸併兩個相鄰的有序子串...

PAT乙級 1035插入與歸併

根據維基百科的定義 現給定原始序列和由某排序演算法產生的中間序列,請你判斷該演算法究竟是哪種排序演算法?輸入在第一行給出正整數 n 100 隨後一行給出原始序列的 n 個整數 最後一行給出由某排序演算法產生的中間序列。這裡假設排序的目標序列是公升序。數字間以空格分隔。首先在第 1 行中輸出inser...