資料結構(歸併排序)

2021-10-02 12:45:09 字數 2387 閱讀 8713

歸併排序(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 ...