PAT 1035 插入與歸併 25 分

2021-10-19 11:43:53 字數 1720 閱讀 2641

題目傳送門

<==戳這

這道題考查對 插入(選擇)排序 和 歸併排序 「原理」 的掌握程度,如果只是背的模板,那這道題可能會超時或沒思路。

原始序列==> a ,

某排序演算法產生的中間序列==> b

關鍵點:

1.判斷排序型別

遍歷b陣列,第一次 b [ i ] > b [ i + 1 ] 的時候就是下一次插入排序的標誌性位置;

然後對從 i+1 開始遍歷,如果 a [ i ] == b [ i ] 直到最後都成立,說明是插入排序,反之為歸併排序;

puts

("insertion sort");

sort

(b+1

,b+1

+id);==

>id是第一次 b [ i ]

> b [ i +

1] 的時候 i+

1 的值

printf

("%d"

,b[1])

;for

(int i=

2;i<=n;i++

)printf

(" %d"

,b[i]);

這裡暫時沒看懂也沒關係,後面看整體更清晰

3.歸併排序的下乙個排序

讓 a 陣列(即原序列陣列)每次迴圈都模擬歸併排序,再與 b 陣列匹配

puts

("merge sort");

int k=1;

==>k是歸併排序的「規模」

while(1

)}k*=2

;==>調整「規模」

int j;

for(j=

0;j)sort

(a+1

+j*k,a+

1+n);==

>因為元素個數不一定是「規模」的整數倍,所以要對「尾巴」進行單獨處理

if(i==n+1)

}printf

("%d"

,a[1])

;for

(int i=

2;i<=n;i++

)

上完整**:

#include

#include

#include

using

namespace std;

const

int maxn=

200;

int a[maxn]

,b[maxn]

;int

main()

}int j;

for(j=i+

1;j<=n;j++)}

==>sign==

1為插入排序

if(sign==1)

else

} k*=2

;int j;

for(j=

0;j)sort

(a+1

+j*k,a+

1+n);if

(i==n+1)

}printf

("%d"

,a[1])

;for

(int i=

2;i<=n;i++)}

}

PAT 1035 插入與歸併 25

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

PAT 1035 插入與歸併

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

PAT1035 插入與歸併

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