歸併排序是乙個相當「穩定」的演算法對於其它排序演算法,比如希爾排序,快速排序和堆排序而言,這些演算法有所謂的最好與最壞情況。而歸併排序的時間複雜度是固定的,它是怎麼做到的?
首先來看歸併排序要解決的第乙個問題:兩個有序的陣列怎樣合成乙個新的有序陣列,比如陣列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...