有乙個陣列,
首先我們要做的就是將這個初始陣列劃分成兩半
然後想辦法把左邊的陣列進行排序,把右邊的陣列也進行排序
最後在合併起來(歸併起來)
歸併排序使用的就是分治思想。分治,顧名思義,就是分而治之,將乙個大問題分解成小的子問題來解決。小的子問題解決了,大問題也就解決了。
但是,這會有乙個疑問,我怎麼對左右兩邊的陣列進行排序呢?這時候就需要重複進行上面的三個步驟,把左半部分、右半部分分別再劃分成兩半,直到左右兩個部分只剩乙個元素不能再進行劃分就停止。就像下面這樣:
這個時候左右部分只有乙個元素,它們已經是排好序的了。我們只需要對他們進行歸併就可以了。
然後就是逐層的向上歸併,一直歸併到整個陣列的最後一層,整個陣列就全部有序了。
在歸併的時候,我們需要開闢乙個臨時陣列存放每一次歸併後的資料。
遞推公式:
merge_sort(l…r) = merge(merge_sort(l…mid), merge_sort(mid+1…r))
終止條件:
l >= r 不用再繼續分解
merge_sort(l...r)
,表示需要給l
到r
之間的陣列進行排序。 然後我們將這整個陣列的排序問題轉化為左右兩個子陣列的排序問題。
其中下標mid
等於l
和r
的中間位置,也就是(l+r)/2
。當下標從l
到mid
和從mid+1
到r
這兩個子陣列都排好序之後,我們再將兩個有序的子陣列合併在一起,這樣下標從l
到r
之間的資料就也排好序了。
mergesort(int arr)
mergesort(int arr,int l,int r)
merge(int arr, int l, int mid, int r)
// 兩個必有乙個越界
while(p1 <= mid)
while(p2 <= r)
for(int j = 0;j < tmp.length;j++ )
}
在歸併的操作中,我們準備了兩個游標p1
和p2
,用於表示arr[l...mid]
和arr[mid +1,r]
的第乙個位置。
比較這兩個元素arr[p1]
和arr[p2]
,如果arr[p1] <= arr[p2]
,我們就把arr[p1]
放入到臨時陣列 tmp,並且p1
後移一位,否則將arr[p2]
放入到陣列 tmp,p2
後移一位。
繼續上面的過程,直到其中乙個子陣列中的所有資料都放入臨時陣列中,然後再把另乙個陣列中的資料依次加入到臨時陣列的末尾,這個時候,臨時陣列中儲存的就是兩個子陣列合併之後的結果了。最後再把臨時陣列 tmp 中的資料拷貝到原陣列arr[l…r]
中。
歸併排序 Merge sort
merge the a s.m and a m 1.t to r s.t template void two merge typet a,typet r,int s,int m,int t while i m r k a i while j t r k a j merge the a 0.n 1 s...
歸併排序(merge sort)
歸併排序 歸併排序是一種遞迴排序演算法,無論陣列元素的原始順序如何,其效能恆定不變。將陣列一分為二,分別排序兩部分元素,再將有序的兩半陣列歸併為乙個有序陣列。歸併步驟比較陣列前一半的元素與陣列的後一半元素,並將較小元素移到臨時陣列,該過程繼續前進,直到其中一半再沒有元素為止。此後只需將其餘元素移到臨...
歸併排序 Merge Sort
歸併排序 merge sort 是利用 歸併 技術來進行排序。歸併是指將若干個已排序的子檔案合併成乙個有序的檔案。兩路歸併演算法 1 演算法基本思路 設兩個有序的子檔案 相當於輸入堆 放在同一向量中相鄰的位置上 r low.m r m 1.high 先將它們合併到乙個區域性的暫存向量r1 相當於輸出...