題目傳送門
<==戳這
這道題考查對 插入(選擇)排序 和 歸併排序 「原理」 的掌握程度,如果只是背的模板,那這道題可能會超時或沒思路。
原始序列==> 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個元素的有序子串行,然後每次迭代歸併兩個相鄰的有序子串行,直到...