簡單的歸併排序

2021-10-02 07:43:08 字數 748 閱讀 9238

歸併排序:是利用歸併的思想實現的排序方法,該演算法採用經典的分治策略(分治法將問題分(divide)成一些小的問題然後遞迴求解,而治(conquer)的階段則將分的階段得到的各答案"修補"在一起,即分而治之)。

下面的很清晰的反映了"從下往上"和"從上往下"的歸併排序的區別。

從上面的圖中可以看出,歸併的核心思想是:分治。當我們要排序這樣乙個陣列的時候,首先將這個陣列分成一半。然後再繼續二分,直到每乙個為一部分為止,然後做進行歸併,歸併到上乙個層級後繼續歸併,歸併到更高的層級,直到最後歸併完成。

在這個過程中我們可以開闢乙個臨時陣列的來輔助我們的歸併。它雖然比選擇排序,插入排序使用了更多的儲存空間,也就是說它需要o(n)的額外空間來完成排序但無論記憶體也好還是硬碟也好可以儲存的資料越來越多,所以設計乙個演算法,時間複雜度是優先考慮的。

當我們比較完後,剩餘部分比之前的值都大或都小,所以只需將剩餘部分直接移上去就好了,我們用while進行判斷。

我們用**實現如下:

void fun(int a,int mid,int b)

}while(i <= mid) c[k++] = num[i++];

while(j <= b)c[k++] = num[j++];

for(i = a;i <= b;i++)

num[i] = c[i];void my(int a,int b)

}

簡單的歸併排序

第一篇 歸併排序就是一種分治法的思想,通過遞迴呼叫自身函式將原問題劃分為其子問題,再求解子問題,然後將子問題合併的過程。例如有序列,第一次呼叫劃分為和兩個堆,第二次呼叫劃分為,4個堆,第三次呼叫劃分為,到這一步劃分結束,即結束的標誌就是子串行只有1個元素,可以這樣理解,當子串行只有乙個元素時,我們認...

歸併排序的簡單實現

學習遞迴最開始就是斐波那契和歸併排序。核心思想就是遞迴地把序列分成兩部分,直到只剩乙個元素。然後將每次劃分的兩部分再遞迴地合併起來,合併時候的順序覺決定了排序的順序還是逆序。劃分的過程可以看做是生成一顆葉子結點數為n的二叉樹,這個過程的複雜度為lgn 樹的高度 而合併的過程是相當於將每層的節點數相加...

歸併排序以及歸併排序的優化

1 歸併排序的實現 歸併排序也利用了分治法的思想,首先將序列分成左右兩部分,將左右兩部分分別排序,然後將有序的兩個子串行進行合併 即merge操作 程式是遞迴進行的,主函式實現如下 歸併排序主函式 void merge sort int a,int first,int last else while...