我的個人**
部落格** blog/blog/243
歡迎交換友鏈 :-)
根據維基百科的定義:
插入排序是迭代演算法,逐一獲得輸入資料,逐步產生有序的輸出序列。每步迭代中,演算法從輸入序列中取出一元素,將之插入有序序列中正確的位置。如此迭代直到全部元素有序。
歸併排序進行如下迭代操作:首先將原始序列看成 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中,的排序
1. , , , ,
2. , ,
3. ,
4. 簡單來說就是將陣列分為k=2個組,然後分為k *= 2個組...
此題用sort排序即可,只需了解原理,具體**不需要使用
如何區分insertion sort和merge sort?
由於題目性質,提供的陣列不可能一次運算就排序成功,這樣就無法判斷排序方式了
merge sort在排序中是分組排序,必定會有兩處b[i]>b[i+1],而insertion sort只有一處b[i]>b[i+1],而且此處之後的陣列必然和原陣列相同,我們可以找出第一處b[i]>b[i+1],然後檢視後面的陣列是否全部相同
如何繼續一次排序?
insertion sort只需多sort一位即可
merge sort需要將a按原理運算(用sort函式即可),等到a全部等於b時,再運算一次即可
**:
#include using namespace std;
int main()
}int flag = 0;// 1 -> merge sort, 0 -> insertion sort
for (int i=temp+1; i}
if (flag)
}k *= 2;
for (int i=0; i// 注意餘下的數
sort(a+n/k*k, a+n);}}
else
for (int i=0; iprintf("%d\n", a[n-1]);
return 0;
}
PAT 乙級 1035 插入與歸併
1.題目描述 根據維基百科的定義 插入排序是迭代演算法,逐一獲得輸入資料,逐步產生有序的輸出序列。每步迭代中,演算法從輸入序列中取出一元素,將之插入有序序列中正確的位置。如此迭代直到全部元素有序。歸併排序進行如下迭代操作 首先將原始序列看成n個只包含1個元素的有序子串行,然後每次迭代歸併兩個相鄰的有...
PAT乙級 1035 插入與歸併
根據維基百科的定義 插入排序是迭代演算法,逐一獲得輸入資料,逐步產生有序的輸出序列。每步迭代中,演算法從輸入序列中取出一元素,將之插入有序序列中正確的位置。如此迭代直到全部元素有序。歸併排序進行如下迭代操作 首先將原始序列看成 n 個只包含 1 個元素的有序子串行,然後每次迭代歸併兩個相鄰的有序子串...
PAT乙級 1035插入與歸併
根據維基百科的定義 現給定原始序列和由某排序演算法產生的中間序列,請你判斷該演算法究竟是哪種排序演算法?輸入在第一行給出正整數 n 100 隨後一行給出原始序列的 n 個整數 最後一行給出由某排序演算法產生的中間序列。這裡假設排序的目標序列是公升序。數字間以空格分隔。首先在第 1 行中輸出inser...