資料結構(3)歸併排序

2022-05-05 15:18:09 字數 2129 閱讀 2860

歸併排序(merging sort)就是利用歸併的思想實現的排序方法。它的原理是假設初始序列含有n個記錄,則可以看成是n個有序的子串行,每個子串行的長度為1,然後兩兩歸併,得到[n/2]個長度為2或1的有序子串行,再兩兩歸併,直至得到乙個長度為n的有序序列為止,這種排序方法成為2路歸併排序。

package sort;

class mergesort ;;

mergesort ms = new mergesort();

ms.msort(list);

system.out.println("");

system.out.println("最終結果:");

ms.printarrry(list); }

private void printarrry(int a)

} private void msort(int list)

private void mergesort(int list,int a, int b)

else }

private void merge(int list, int left, int mid, int right)

else

} while (a<=mid)

while (b<=right)

while (d <= right)

}}

private void mergesort(int  list,int a, int b)

else

}

private void merge(int  list, int left, int mid, int right)

else

} /*將前半部分還有剩餘的陣列取出,存入tempaddr*/

while (a<=mid)

/*將後半部分還有剩餘的陣列取出,存入tempaddr*/

while (b<=right)

/*將已經歸併好的陣列,傳給list,使得list原有的對應於list[left..right]的部分有序*/

while (d <= right)

}

left:0 mid:0 right:1

此時陣列為:

408050306070109020

left:0 mid:1 right:2

此時陣列為:

405080306070109020

left:3 mid:3 right:4

此時陣列為:

405080306070109020

left:0 mid:2 right:4

此時陣列為:

304050608070109020

left:5 mid:5 right:6

此時陣列為:

304050608010709020

left:7 mid:7 right:8

此時陣列為:

304050608010702090

left:5 mid:6 right:8

此時陣列為:

304050608010207090

left:0 mid:4 right:8

此時陣列為:

102030405060708090

最終結果:

紅色部分顯示的是,此時操作的陣列的區間,黑色部分,則是未被操作的區間。

通過這張圖可以看出,因為mid=(a+b)/2,mergesort(list, a, mid),所以list陣列一路向下拆分,從0-8,到0-4,到0-2,到0-1,最後到0-0,此時得到return,返回遞迴上一層,此時mid為0,mergesort(list, mid+1, b),也可以得到return,然後就執行merge(list, a, mid, b)。這句話就是把此時(a,mid,b)=(0,0,1)進行了歸併,使得list[0..1]有順序。

以此類推,接下來依次是(a,mid,b)=(0,1,2),(a,mid,b)=(0,2,4),....,(a,mid,b)=(5,6,8),(a,mid,b)=(0,4,8)

資料結構 歸併排序

排序 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 ...