這是我自己理解的利用歸併排序對乙個無序陣列進行排序的簡單過程。
圖中的波浪線就是每次執遞迴的時機。
在我學習這個演算法的時候遇到的困難:
為什麼使用的是雙遞迴?
這個原因在我認為是:因為歸併過程是將兩個陣列進行歸併,那麼去**找這兩個陣列呢?就是通過雙遞迴。這裡比較重要的就是雙遞迴了,什麼是雙遞迴呢?其實我們之前很早接觸過雙遞迴:斐波那契數列:
下面是我自己的一點理解,可能解釋的有點繁瑣,但是大體是正確的。等我有更深的理解後再來更新。
public void sort(int array,int start,int end,int temp)
}
我理解的雙遞迴:過程類似乙個遞迴樹,類似於二叉樹深度優先遍歷中序遍歷(雖然乙個是生成二叉樹,乙個是遍歷二叉樹)。首先根結點是1 3 5 10 4 9 ,(接下來我們只看遞迴樹右邊一部分),(記第乙個雙遞迴整體為a,即將1 3 5 化成兩部分的這個),經過劃分,分為 1 3 和 5 兩個節點,以1 3 為根節點進入第乙個雙遞迴整體(記為a1)的第乙個遞迴(記為a11),(之後的記號表示不再介紹,應該可以看懂什麼意思),進入後將a11作為新的雙遞迴整體,繼續劃分,分成 1 3 兩個部分,以1為根節點進入a111的內部,進入後a111作為新的雙遞迴整體,但是在a111內部發現因為start=end,因此a111立即結束,得到乙個序列 「1」,然後執行a112,進入後a112作為新的雙遞迴整體,a112執行發現start = end,因此退出遞迴,得到乙個序列 「3」,這時候a11遞迴內部的這個雙遞迴:a111,a112都執行完畢,並劃分出了兩個序列:「1」,「3」,這時呼叫merge()對兩個序列進行合併。合併完成後得到「1 3」,而後遞迴來到的a2,a2的根節點為5,進入後判斷start=end,就停止遞迴,得到序列 「5」。到此為止,a1和a2執行完畢,輪到執行a的merge()了,執行過後得到了序列"1 3 5"。
以上介紹的是歸併排序遞迴生成的遞迴樹的一部分,但是一部分理解了整體也就理解了。
加油!!!
歸併排序理解遞迴
點開之後可以看到歸併排序的動態演示圖,只要能理解這個圖,就能夠理解遞迴和歸併排序了。你可以看到圖裡面的數分了四層,然後變成八個數,但是每兩個數是乙個遞迴裡面的,所以先從第乙個和第二個數開始歸併,歸併的時候比較大小,歸併完之後,這是這個小遞迴的結束,然後這層總共有四個小遞迴,依次執行完即可。然後才是第...
歸併排序理解遞迴
點開之後可以看到歸併排序的動態演示圖,只要能理解這個圖,就能夠理解遞迴和歸併排序了。你可以看到圖裡面的數分了四層,然後變成八個數,但是每兩個數是乙個遞迴裡面的,所以先從第乙個和第二個數開始歸併,歸併的時候比較大小,歸併完之後,這是這個小遞迴的結束,然後這層總共有四個小遞迴,依次執行完即可。然後才是第...
排序演算法思想記錄 歸併排序演算法 遞迴
歸併排序演算法思想為每乙個陣列中的數字可以看做是單位為1的有序陣列,將兩個有序陣列進行對比後合併,然後層層對比合併,最後為排序成功的陣列 首先需要將陣列分為兩塊 然後進入遞迴左半數組和右半陣列,繼續分割為兩塊,當陣列長度為1時返回。形參為 陣列 和陣列長度 void mergesort int k,...