歸併排序(merge-sort)是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法(divide and conquer)的乙個非常典型的應用。將已有序的子串行合併,得到完全有序的序列;即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。歸併排序是一種穩定的排序方法。
從圖中我們不難看出
第一次是乙個數字為一組進行相鄰兩組比較,使其組內先有順序(如果最後由剩餘,則單獨為一組)
第二次是兩個數字為一組進行相鄰兩組比較,使其組內先有順序(如果最後由剩餘,則單獨為一組)
第三次是四個數字為一組進行相鄰兩組比較,使其組內先有順序(如果最後由剩餘,則單獨為一組)
第四次是八個數字為一組進行相鄰兩組比較,使其組內先有順序(如果最後由剩餘,則單獨為一組)。。
。我們不難看出,每一次比較時,每一組比較的數字的個數是2倍的關係
我們定義四個變數h1,h2,e1,e2
剛開始我們讓h1,h2為組的第乙個元素的下標,e1,e2為組的最後乙個元素的下標
我們讓下標為h1和h2的元素進行比較,將小的元素放入乙個臨時儲存的陣列裡,較小元素的下標進行++操作
第一次比較
例如:h1為31下標,h2為77下標,e1為31下標,e2為77下標,進行h1和h2比較,將較小的31放入乙個臨時儲存的陣列裡,h1進行++操作,這時h1大於e1,所以第一組和第二組數字已經比較完成,可以直接將h2數字繼續存入臨時儲存的陣列裡,然後令h1 = e2+1;e1=h1+組的數字個數-1;h2=e1+1;e2=h2+組的數字個數-1;(這裡注意不能讓下標越界)繼續進行如上比較
第一次比較結果為:31 77 46 97 66
第二次比較
例如:h1為31下標,h2為46下標,e1為77下標,e2為97下標,進行h1和h2比較,將較小的31放入乙個臨時儲存的陣列裡,h1進行++操作,這時h1不大於e1,所以繼續進行h1和h2比較,將較小的46放入乙個臨時儲存的陣列裡,h2進行++操作,繼續進行h1和h2比較,將較小的77放入乙個臨時儲存的陣列裡,第一組和第二組數字已經比較完成,可以直接將h2數字繼續存入臨時儲存的陣列裡,然後令h1 = e2+1;e1=h1+組的數字個數-1;h2=e1+1;e2=h2+組的數字個數-1;(這裡注意不能讓下標越界)繼續進行如上比較(如果最後有單獨的組那就直接存入臨時儲存的陣列裡)
第二次比較結果為:31 46 77 97 66
第三次比較
如上面操作。。。
第三次比較結果為:31 46 66 77 97
#include
#include
#include
#define length 13
//待排序的數字個數
void
meger
(int arr,
int len,
int width)
//歸併排序的一次排序
while(1
)//進行一次歸併排序
head2 = tail1+1;
tail2 = head2+width-1;
if(tail2>len-1)
if(head2>tail2)
while
( head1 <= tail1 && head2 <= tail2 )
else
}while
(head1<=tail1)
while
(head2<=tail2)
}while
(head1
for(
int i=
0;i)free
(brr);}
void
megersort
(int arr,
int len)
//歸併排序
}void
showsort
(int arr,
int len)
//列印
printf
("\n");
}int
main()
showsort
(arr,length)
;megersort
(arr,length)
;//歸併排序
showsort
(arr,length)
;return0;
}
資料結構 歸併排序
排序 sort 或分類 內部排序方法可以分為五類 插入排序 選擇排序 交換排序 歸併排序和分配排序。歸併排序 include using namespace std 歸併排序中的合併演算法 void merge int a,int left,int center,int len int t int ...
資料結構 歸併排序
歸併排序,即merge sort,通過遞迴式的merge操作 merge即歸併 實現排序。演算法思想是分治思想 divide and conquer 歸併排序一般是遞迴實現的 時間複雜度o nlgn 遞迴都是一去一回,去的時候divide,回的時候conquer。表達欠提煉 1 divide,分 遞...
資料結構 歸併排序!!!
歸併排序 整體思想 將資料分成很多的部分,每次排序資料的一部分,然後將兩部分的資料進行整體排序,這樣一步一步將整體資料排序。如圖 注 將需要排序的資料進行分塊,當每個塊的資料足夠的少的時候就可以進行效率高的排序方法,當兩塊資料排序好的時候就可以將兩塊排序好的資料進行合併。具體實現方法 ifndef ...