第二週(歸併排序詳解)

2021-10-01 07:06:02 字數 1913 閱讀 5601

簡單理解思路

時間複雜度

#include

int i,j,a[

10000

],n;

void

merge

(int left,

int middle,

int right)

while

(i<=middle)

b[k++

]=a[i++];

while

(j<=right)

b[k++

]=a[j++];

for(i=left;i<=right;i++

) a[i]

=b[i];}

void

mergesort

(int left,

int right)

intmain()

個人易錯點,這裡是while不是if,if只能執行一次,一次之後就退出了,要記得是while!! 永遠錯在這裡

while

(i<=middle)

b[k++

]=a[i++];

while

(j<=right)

b[k++

]=a[j++

];

我還是想解釋一下,儘管今早檢測中我差點又忘記了我上週詳細寫過的快速冪的模板

好的,舉個栗子

比如現在需要對5 4 8 9 1 2 6排序

然後首先將他們不斷二分,然後分到最後變成單獨的數字了

5    4   8   9   1   2   6

現在將他們進行歸併,在歸併中排序,這個意思就是像下面這樣,

5和4哪個小呢?4小,對的 ,所以把4先放在新陣列裡,然後再放入5,

5    4   8   9   1   2原陣列a

4   5新陣列b

然後在把這兩個值放回原陣列中使原陣列a變為

4    5   8   9   1   2

再排序第二組8和9,先放入8,然後放入9

4    5   8   9   1   2原陣列a

8   9新陣列b

然後在把這兩個值放回原陣列中使原陣列a變為

4    5   8   9   1   2

然後對4589進行放置,

4    5   8   9   1   2原陣列a

4   5    8   9新陣列b

然後在把這兩個值放回原陣列中使原陣列a變為

4    5   8   9   1   2

再排序1和2,先放入1,然後放入2

4    5   8   9   1   2原陣列a

1   2新陣列b

然後在把這兩個值放回原陣列中使原陣列a變為

4    5   8   9   1   2

最後將它們最後一次歸併

4    5   8   9

1   2

比較兩邊的數字,4和1,1小,所以在新陣列裡先放入1,然後判斷4和2,2小,存入2

然後右邊沒有值了,將左邊剩下部分依次輸入,最後將新陣列b中的值再返回賦給a

得到最終結果啦,陣列a為

1   2   4    5   8   9

歸併排序詳解

一.概念 歸併是指將若干個已排序的子檔案合併成乙個有序的檔案。二.基本思路 設兩個有序的子檔案 相當於輸入堆 放在同一向量中相鄰的位置上 r low.m r m 1.high 先將它們合併到乙個區域性的暫存向量r1 相當於輸出堆 中,待合併完成後將r1複製回r low.high 中。合併過程中,設定...

歸併排序詳解

歸併排序的核心思想是將兩個已經排序的序列合併成乙個序列,那如何得到兩個已經排序的序列呢?我們知道,如果乙個序列只有乙個元素,那該序列是已經排序的,這樣我們就可以利用分治的思想,將未排序的序列劃分成更小的序列,只到我們可以很方便的對小序列進行排序 比如劃分到序列只有乙個元素,或者序列很小可以方便的使用...

歸併排序 詳解

歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用,歸併排序將兩個已排序的表合併成乙個表。優點1.歸併排序的效率達到了巔峰 時間複雜度為o nlogn 這是基於比較的排序演算法所能達到的最高境界 2.歸併排序是一種穩定的...