排序系列六 歸併排序

2021-09-23 22:37:48 字數 1376 閱讀 1641

這個排序有點費腦子,大家還得花時間好好看看

歸併排序原理如下圖所示:

**如下:

//歸併排序(mergesort):建立在歸併操作上的採用分治法的一種有效的排序演算法,將已有序的子串行合併,得到完全有序的序列;

//即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。

//一般來說從單個元素開始合併,逐漸合併成大的元素,最終,達到整個元素有序的目的。兩組數合併的時候都是從左向右進行比較

//比如a[n]和b[n];先比較a[0]和b[0],小的a[0]放前面,然後比較a[1]與b[0],小的b[0]放a[0]後面,然後比較a[1]和b[1]……

//它是穩定排序

#include#include void mergesort(int a,int n)//兩個形參,分別為陣列和陣列內數的個數

next=0;//next是用來標誌temp陣列下標的,由於每次資料都有返回到a,故每次開始得重新置零

//如果左邊的資料還沒達到分割線且右邊的陣列沒到達分割線,開始迴圈

while(left_min0)//把排好序的那部分陣列返回到最初需要排序的陣列a

} }}

int main()

; int n=sizeof(a)/sizeof(a[0]);

mergesort(a,n);

for(int i=0;i但是上面那個left_max、right_max不是left和right陣列裡面的,而是比它們大一位,下面這個程式就把left_max、right_max都納入陣列裡面,可能更你好理解一點,**如下:

#include#include void mergesort(int a,int n)//兩個形參,分別為陣列和陣列內數的個數

next=0;//next是用來標誌temp陣列下標的,由於每次資料都有返回到a,故每次開始得重新置零

//如果左邊的資料沒比較完且右邊的資料沒比較完,開始迴圈

while(left_min<=left_max && right_min<=right_max)//每一組比較的迴圈,例當i=4時左邊四個元素與右邊四個元素比較

while(next>0)//把temp換到a裡面

}else//(left_min>left_max)左邊的數都已經排好了,只用把temp換到a裡面就行,右邊的數不用動

}} }

}int main()

; int n=sizeof(a)/sizeof(a[0]);

mergesort(a,n);

for(int i=0;i執行結果如下:

六 歸併排序

要將乙個陣列排序,可以先 遞迴的 將它分成層兩半分別排序,然後將結果歸併起來。它能保證任意長度為n的陣列排序所需時間和nlogn成正比 它的缺點則是它所需的額外空間和n成正比。實現歸併的一種直截了當的辦法是將兩個不同的有序陣列歸併到第三個陣列中,兩個陣列中的元素應該都實現了comparable藉口。...

排序演算法(六) 歸併排序

對於歸併排序,與快速排序一樣,巧妙的應用了分治演算法的核心思想,它將整個序列分成若干組子串行,對這些子串行進行排序後,在一步一步進行合併有序子串行,從而使得整個序列達到有序。但針對於歸併排序,有著兩種不同的排序方式,一是通過整個序列進行著手,將這個序列進行一步一步的劃分,自頂向下進行處理,主要步驟包...

排序演算法 六 歸併排序

歸併排序的基本思想是分治法。先將無序序列分為若干個無序子串行,然後對無序子串行進行排序,最後合併有序子串行,得到完全有序的序列。這就是分解,求解,合併的過程。將待排序序列data 0,1,2 n 1 看成是n個長度為一的序列,將相鄰序列進行合併,得到n 2個長度為2的有序序列 將相鄰序列再次進行合併...