排序 五 之歸併排序

2021-09-29 04:38:32 字數 2319 閱讀 5327

歸併排序是乙個相當「穩定」的演算法對於其它排序演算法,比如希爾排序,快速排序和堆排序而言,這些演算法有所謂的最好與最壞情況。而歸併排序的時間複雜度是固定的,它是怎麼做到的?

首先來看歸併排序要解決的第乙個問題:兩個有序的陣列怎樣合成乙個新的有序陣列,比如陣列1{ 3,5,7,8 }、陣列2為{ 1,4,9,10 },首先那肯定是建立乙個長度為8的新陣列咯,然後就是分別從左到右比較兩個陣列中哪乙個值比較小,然後複製進新的陣列中,比如我們這個例子:

{ 3,5,7,8 } { 1,4,9,10 }

{ }一開始新陣列是空的。然後兩個指標分別指向第乙個元素,進行比較,顯然,1比3小,所以把1複製進新陣列中:

{ 3,5,7,8 } { 1,4,9,10 } { 1, }

第二個陣列的指標後移,再進行比較,這次是3比較小:

{ 3,5,7,8 } { 1,4,9,10 } { 1,3, }

同理,我們一直比較到兩個陣列中有某乙個先到末尾為止,在我們的例子中,第乙個陣列先用完。{ 3,5,7,8 } { 1,4,9,10 } { 1,3,4,5,7,8 }

最後把第二個陣列中的元素複製進新陣列即可。

{ 1,3,4,5,7,8,9,10 }

由於前提是這個兩個陣列都是有序的,所以這整個過程是很快的,我們可以看出,對於一對長度為n的陣列,進行合併所需要的比較次數最多為2 * n -1。這其實就是歸併排序的最主要想法和實現,歸併排序的做法是:

將乙個陣列一直對半分,問題的規模就減小了,再重複進行這個過程,直到元素的個數為乙個時,乙個元素就相當於是排好順序的。接下來就是合併的過程了,合併的過程如同前面的描述。一開始合成兩個元素,然後合併4個,8個這樣進行。所以可以看到,歸併排序是「分治」演算法的乙個經典運用。

/*合拼有序陣列*/

intmerge_array

(int

*array,

int start,

int middle,

int end,

int*temp)

while

(i <= middle)

temp[k ++

]= array[i ++];

while

(j <= end)

temp[k ++

]= array[j ++];

for(i =

0; i < k; i ++

) array[start + i]

= temp[i]

;return0;

}/*將需要排序的資料遞迴對半拆分, 再進行合拼*/

int_merge_sort

(int

*array,

int start,

int end,

int*temp)

return0;

}int

mergesort

(int

*array,

int length)

memset

(temp,0,

sizeof

(int

)* length)

;_merge_sort

(array,

0, length -

1, temp)

;free

(temp)

;return0;

}

sort.c

int

main

(int argc,

char

**ar**)

;int buf=

;//int buf[10]=;

length =

sizeof

(buf)

/sizeof

(int);

// heap_sort(buf-1, length);

// shell_sort(buf, length, 2);

// quick_sort(buf, 0, length - 1);

printf

("start merge sort...\n\n");

mergesort

(buf, length)

;for

(i =

0; i < length; i++

)printf

("%d\t "

, buf[i]);

printf

("\n");

return0;

}

測試結果:

排序五 歸併排序

寫作功底有限,不明白的推薦看一下麻省理工學院的演算法導 開課。歸併演算法是指將兩個有序序列合併為乙個有序序列的方法。例如,現有兩個有序序列a 1,3,5 b 2,4,6 將其合併為乙個序列c。分別對a,b建乙個游標索引,初始值為0。第一步比較a,b索引的值a 1,3,5 b 2,4,6 1 2,所以...

五 歸併排序

歸併排序,首先需要用到遞迴,遞迴這個東西說難不難,說簡單也挺煩的。遞迴從 直觀的表現來看,就是自己呼叫自己。比如這樣 public int recursive int a 這樣就是乙個遞迴,但是問題是這樣會無線遞迴下去。所以必須給他乙個出口 public static void main strin...

演算法五之歸併排序

public class merge 呼叫遞迴先對陣列進行分組 static void sort int arr,int low,int hi int mid low hi low 2 sort arr,low,mid sort arr,mid 1,hi merge arr,low,hi,mid s...