題目傳送門
這題我沒ac,以下是柳神大佬題解:
分析:先將i指向中間序列中滿足從左到右是從小到大順序的最後乙個下標,再將j指向從i+1開始,第乙個不滿⾜足a[j] == b[j]的下標,如果j順利利到達了下標n,說明是插入排序,再下一次的序列列是sort(a, a+i+2);否則說明是歸併排序。歸併排序就別考慮中間序列了,直接對原來的序列進行模擬歸併時候的歸併過程,i從0到n/k,每次一段得sort(a + i * k, a + (i + 1) * k);最後別忘記還有最後剩餘部分的sort(a + n / k * k, a + n);這樣是一次歸併的過程。直到有一次發現a的順序和b的順序相同,則再歸併一次,然後退出迴圈~
注意:一開始第三個測試點一直不過,天真的我以為可以模擬一遍歸併的過程然後在過程中判斷下一步是什什麼。。然⽽而真正的歸併演算法它是乙個遞迴過程。。也就是先排左邊一半,把左邊的完全排列成正確的順序之後,再排右邊一半的。。而不是左右兩邊⼀一起排列的。。後來改了了自己的歸併部分判斷的**就過了。。。。◕‿◕。
#include
#include
using
namespace std;
intmain()
for(
int i =
0; i < n; i++
)for
(i =
0; i < n -
1&& b[i]
<= b[i +1]
; i++);
for(j = i +
1; a[j]
== b[j]
&& j < n; j++);
if(j == n)
else
} k = k *2;
for(
int i =
0; i < n / k; i++
)sort
(a + n / k * k, a + n);}
}for
(j =
0; j < n; j++
) cout << a[j];}
return0;
}
1035 插入與歸併
題目是pat乙級 思路 簡單修改插入排序和合併排序源 加入和目標比較若相等,就退出。注意 插入排序不是從第0個元素開始,是從第1個元素開始的。訓練目的 插入排序 合併排序 題目描述 根據維基百科的定義 插入排序是迭代演算法,逐一獲得輸入資料,逐步產生有序的輸出序列。每步迭代中,演算法從輸入序列中取出...
1035 插入與歸併
時間限制 200 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 chen,yue 根據維基百科的定義 插入排序是迭代演算法,逐一獲得輸入資料,逐步產生有序的輸出序列。每步迭代中,演算法從輸入序列中取出一元素,將之插入有序序列中正確的位置。如此迭代直到全...
1035 插入與歸併
1035 插入與歸併 25 分 根據維基百科的定義 插入排序是迭代演算法,逐一獲得輸入資料,逐步產生有序的輸出序列。每步迭代中,演算法從輸入序列中取出一元素,將之插入有序序列中正確的位置。如此迭代直到全部元素有序。歸併排序進行如下迭代操作 首先將原始序列看成 n 個只包含 1 個元素的有序子串行,然...