PAT 1035 插入與歸併 25

2021-06-29 12:00:09 字數 1974 閱讀 1698

根據維基百科的定義:

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

歸併排序進行如下迭代操作:首先將原始序列看成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,但也許某相鄰的若干個段連起來也是有序的,這樣遞增的段長就成了4或者更大,這給識別就造成了難度,我原以為只要求出每個遞增段的段長,如果每個段的長度都相等(排除最後一段,因為最後一段可能不足一段的段長)就是歸併,現在想來真是圖樣圖森破。好在給我了啟發,非常感謝。他的思想就是拿到第一段遞增段的長度,將這個長度作為步長,將數列分為k個段,看這每個段是否全部有序,如果不是,段長除以2重複以上過程。這裡我覺得原帖有乙個漏洞,如果第乙個遞增段長為6,即由3個段長為2的段拼接成,每次除2會出問題,於是我在最前面加了乙個判斷,判斷第乙個遞增段長是否是2的指數,如果是,繼續,如果不是,直接設定段長為2
關於判斷是否為2的指數的函式func(),原理是i(設i為2的指數)與i-1的二進位制按位與的結果是0,如8的二進位制數為1000,7為0111,按位與的結果即為0
#include #include #include using namespace std;

bool issorted (int *numlist, int length)

return true;

}int func(int i)

int main()

} int sortlength = seqlength;

sort(ul, ul+seqlength);

for(i = 0; i < n; i++)

if(ul[i] != numlist[i])

break;

if(i == n)

flag = 1;

else

if(! issorted(numlist+k*sortlength, n-k*sortlength))

allpass = 0;

if(allpass == 0)

sortlength /= 2;

}} }

if(flag == 0) }

else

for(i = 0; i < n; i++)

printf("\n");

return 0;

}

PAT 1035 插入與歸併 25 分

題目傳送門 戳這 這道題考查對 插入 選擇 排序 和 歸併排序 原理 的掌握程度,如果只是背的模板,那這道題可能會超時或沒思路。原始序列 a 某排序演算法產生的中間序列 b 關鍵點 1.判斷排序型別 遍歷b陣列,第一次 b i b i 1 的時候就是下一次插入排序的標誌性位置 然後對從 i 1 開始...

PAT 1035 插入與歸併

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

PAT1035 插入與歸併

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