設計思路:
插入排序的判斷:
(開頭一部分一定有序)&&(無序部分與原序列一致)
歸併排序的判斷:
排除法插入排序迭代一次:
從斷點迭代一次即可
歸併排序迭代一次:
尋找歸併段長度:
1.歸併段最小長度為 1(表示序列未排序)
2.如圖:(每個 l 範圍內均有序)&&(每 2l 範圍內均有序),則 l =
2l,否則終止。最終找到中間序列的歸併段長度 l。
| l | l | l | l | l | l | l | l ||2l
|2l|2l
|2l|**實現:tmp[n] 陣列表示中間序列,且陣列下標從 0 開始
int bool =1;
for(l =
1, i =
1; i < n && bool; i *=2
)}if(bool)
}感謝 ionizing 大佬的部落格,詳細展示了各種錯誤姿勢:
/最初想到像插入排序一樣從頭開始尋找最長有序子串行,來確定 l 值,此錯誤姿勢破解如下,102
1837
5940
6123
8574
906我們無法從 123
8 是最長前置有序子列就判斷出歸併段的長度為 4,正確答案應該是 2
編譯器:c (gcc)#include
intisinsertion
(int n,
int num,
int half)
;int
nextmerge
(int n,
int num,
int half)
;int
comp
(const
void
*a,const
void
*b)int
main()
return0;
}int
isinsertion
(int n,
int num,
int half)
for(i++
, lenth = i; i < n && half[i]
== num[i]
; i++)if
(i < n)
return1;
printf
("insertion sort\n");
lenth++
;qsort
(num, lenth,
sizeof
(int
), comp)
;return0;
}int
nextmerge
(int n,
int num,
int half)
qsort
(num + j * lenth, n % lenth,
sizeof
(int
), comp);}
return0;
}
1035 插入與歸併
題目是pat乙級 思路 簡單修改插入排序和合併排序源 加入和目標比較若相等,就退出。注意 插入排序不是從第0個元素開始,是從第1個元素開始的。訓練目的 插入排序 合併排序 題目描述 根據維基百科的定義 插入排序是迭代演算法,逐一獲得輸入資料,逐步產生有序的輸出序列。每步迭代中,演算法從輸入序列中取出...
1035 插入與歸併
時間限制 200 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 chen,yue 根據維基百科的定義 插入排序是迭代演算法,逐一獲得輸入資料,逐步產生有序的輸出序列。每步迭代中,演算法從輸入序列中取出一元素,將之插入有序序列中正確的位置。如此迭代直到全...
1035 插入與歸併
1035 插入與歸併 25 分 根據維基百科的定義 插入排序是迭代演算法,逐一獲得輸入資料,逐步產生有序的輸出序列。每步迭代中,演算法從輸入序列中取出一元素,將之插入有序序列中正確的位置。如此迭代直到全部元素有序。歸併排序進行如下迭代操作 首先將原始序列看成 n 個只包含 1 個元素的有序子串行,然...