以下歸併排序解析過程由最內層呼叫的merge函式分析,然後次內層merge_sort,最後到如何使用。由內而外解析,更容易理解
以下函式用於實現將陣列a中,從索引l到r的元素以mid為界,將mid左邊(已由小到大排好序)和右邊(已由小到大排好序),
按照由小到大合併一起放回索引l到r中
l mid r
(1)將陣列a從索引l到r一次放入aux從索引0到r-l
(2)若i>mid,則表明mid左邊已全部放入a[k],mid右邊已排過序,直接乙個接乙個迴圈放入a[k]即可
(3)與(2)相反,mid左邊邊已排過序,直接乙個接乙個迴圈放入a[k]即可
(4)若mid左邊的元素大於mid右邊的,則將右邊的此元素放在a[k]中,j++(下次迴圈中左邊的此元素與mid右邊的下乙個元素對比)
(5)與(4)相反,則將左邊的元素放入a[k]中,i++(下次迴圈用mid左邊下一元素與mid右邊的次元素對比)
void merge(int a, int l, int r, int mid)
else if (j > r)//------------------------------(3)
else if (aux[i - l] > aux[j - l])//------------(4)
else//-----------------------------------------(5)}}
/*
以下函式解析過程:
(1)將mid左邊的元素由小到大排序
例如:a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]
4 2 3 5 7 1 6 10 8 9
首次進入merge_sort後
l mid l mid
0 4 ==> 0 2 ==> 0 1 ==> 0 0 此時l=0,r=1時進入(1)(2)都return,則進入merge,對a[0]a[1]排序
mid+1 r mid+1 r
4 9 3 4 2 2 1 1
對mid+1 r 進入(2)返回,則進入merge,對索引l=0,r=2,mid=1兩邊進行合併排序
2 2
對mid+1 r 進入(2)後,l mid
3 4 ==> 3 3 ==>此時進入(1)(2)都return,則進入merge,對a[3]a[4]排序
mid+1 r
4 4
此時進入merge,對對索引l=0,r=4,mid=2兩邊進行合併排序,依次類推
(2)將mid右邊的元素由小到大排序
*/void merge_sort(int a, int l, int r)
**merge_sort實現過程:
如何使用:
int main()
; int n=10, i;
mergesort(a, 0, n-1);
for (i = 0; i < n; i++)
printf("%d ", a[i]);
return 0;
}
演算法思想:有了以上的解析,相信對以下的歸併排序定義很好理解
歸併排序(merge-sort)是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法(divide and conquer)的乙個非常典型的應用。將已有序的子串行合併,得到完全有序的序列;即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。
C C 實現歸併排序
將乙個陣列的左半部分先排好序,然後再將右半部分排好序 然後通過外排的方式將左右兩個部分整體排好序 外排,即額外使用乙個輔助陣列,使整體有序 堆排序氣泡排序 選擇排序 插入排序 隨機快速排序 一維隨機數組生成器 歸併排序 實現外排 template class t void merge t arr,i...
排序演算法之歸併排序java實現
歸併排序主要是二路歸併排序。二路歸併排序的基本思想是 設陣列a中存放了n個資料元素,初始時把它們看成是n個長度為1的有序子陣列,然後從第乙個子陣列開始,把相臨的子陣列兩兩合併,得到n 2個長度為2的新的有序子陣列 當n為奇數時最後乙個新的子陣列長度為1 對這些新的子陣列再兩兩合併 如此重複,直到得到...
排序演算法之歸併排序(Java實現)
歸併排序的思想是將區域性有序的陣列合併為乙個大的有序陣列,前提是需要保證區域性陣列有序,如果區域性沒有順序,那麼就拆分,再合併,最差的情況是,拆到兩個陣列都只有乙個元素的時候,這時候再合併他們就成了乙個有序的陣列。涉及到演算法上,就是將陣列直接分為兩部分low mid,mid 1 high,其中mi...