//遞迴函數
// sort_s 為每次遞迴函數所知道的最前指標位址
// sort_e 為每次遞迴函數所知道的最後指標位址
int Sort_Merge(int sort_s,int sort_e){
//宣告
int i,j,k=0,tmp_sort[ sort_e-sort_s ];
//判定是否需要繼續分為二等分
if (sort_e-sort_s > 1){
Sort_Merge(sort_s,(sort_s+sort_e)/2);
Sort_Merge((sort_s+sort_e)/2,sort_e);
}
//設定 i 一開始為最前指標位址
i=sort_s;
//設定 j 一開始為最前與最後之中間指標位址
j=(sort_s+sort_e)/2;
//利用迴圈先將數列大小放置於暫存陣列
while(k < ( sort_e - sort_s) ){
//判定 i 和 j 標地物是否超過分界
//判定皆尚未過界
if ( (i < (sort_s + sort_e)/2) && (j < sort_e) ){
//判定 i 和 j 指標之數字何者較小
//判定 i 較小
if( *(data+i) < *(data+j) ){
//放置暫存陣列
tmp_sort[k] = *(data+i);
// i 指標移動
i++;
}
//判定 j 較小或 j 和 i 相同大小
else{
//放置暫存陣列
tmp_sort[k] = *(data+j);
// j 指標移動
j++;
}
}
//判定僅 i 過界
else if ( (i >= (sort_s+sort_e)/2) && (j < sort_e) ){
//放置暫存陣列
tmp_sort[k] = *(data+j);
// j 指標移動
j++;
}
//判定僅 j 過界
else if ( (i < (sort_s+sort_e)/2) && (j >= sort_e) ){
//放置暫存陣列
tmp_sort[k] = *(data+i);
// i 指標移動
i++;
}
//增加陣列位址
k++;
}
//將暫存陣列複寫至原指標
for(k=0;k < (sort_e - sort_s );k++){
*(data+(sort_s+k))=tmp_sort[k];
}
}
Merge Sort 最大的特色在於,不管處理 Increase 、 Decrease 和 Random 排列的狀況底下,差異性不大且處理速度快,但是與 Insertion Sort(Code-2) 比較 Increase 的狀況下,還是會相較於 Insertion Sort 慢。

0 件のコメント:
コメントを投稿