1035 插入與歸併(C語言)

2021-09-12 03:53:47 字數 1622 閱讀 7926

設計思路:

插入排序的判斷:

(開頭一部分一定有序)&&(無序部分與原序列一致)

歸併排序的判斷:

排除法插入排序迭代一次:

從斷點迭代一次即可

歸併排序迭代一次:

尋找歸併段長度:

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 個元素的有序子串行,然...