Java實現歸併排序

2021-09-20 03:42:32 字數 2983 閱讀 7073

歸併排序(merge-sort)是利用歸併的思想實現的排序方法,該演算法採用經典的分治(divide-and-conquer)策略(分治法將問題分(divide)成一些小的問題然後遞迴求解,而治(conquer)的階段則將分的階段得到的各答案"修補"在一起,即分而治之)。,通過將大問題簡化即可得到最終的答案。

如上圖所示,剛開始有一組亂序的數字,需要對他們進行排序,可將原始的長陣列從中一分為二,得到兩個較小的數字陣列

給短陣列排序要比給長陣列排序簡單些,所以為了能再簡單,將得到的較短陣列再次一分為二,直到陣列中只含有乙個數字, 此時,我們可以認為單個數字在他們各自的陣列中是有序的

之後將兩個有序的陣列合併到一起並整理為有序陣列,之後再次逐層向上合併整理,直到合併成為乙個原始長度的陣列,所得陣列為最終的有序陣列

在寫歸併排序時,可先從將單個數字後向乙個序列合併的過程即「歸」的過程入手,以上述圖示為例,假設我們所有的資料已經合併完成,現在只剩下兩個4長的有序陣列,我們現在要做的就是將這兩個有序陣列合併為最後的原始長度的有序陣列

我們將合併過程寫到乙個方法之中,格式如下:

private static void mergemethod(int arr, int startindex, int centerindex, int endindex)
方法引數需要:要排序的陣列名開始索引結束索引中間索引引數詳解:

中間索引用來將陣列分為邏輯上的兩個陣列,(其實在將原始陣列逐層一分為二最終讓每個陣列中只含有乙個元素的時候,這些陣列在物理空間上還是在一起的,但在邏輯上是分開的,所以需要中間索引來在邏輯上對他們進行分割,讓他們在邏輯上是分開的)

之後左邊陣列以整體開始索引為開始索引,以中間索引為結束索引,

右邊陣列以中間索引為開始索引,以整體結束索引為結束索引,

通過上述引數,即可將陣列分為邏輯上的兩個陣列,

在將陣列分為邏輯上的兩個陣列後,即可定義臨時陣列,之後用索引依次比較兩個陣列中的各個資料,將小的數字放到臨時陣列中,比較完成後,得到的陣列就是最終排好順序的從小到大的數字陣列

既然需要使用開始索引、結束索引和中間索引,就需要在方法內部定義三個整型變數來存放這些索引,所以需要執行下面的**:

int temparr = new int[endindex - startindex + 1];     

//定義臨時陣列,根據結束索引和開始索引來確定臨時陣列的長度,因為陣列長度可能不一樣,如果是兩個4長陣列合併,則臨時陣列長度為8

int i = startindex; //定義開始索引

int j = centerindex + 1; //定義中間索引

int index = 0; //定義臨時陣列索引

在定義完成需要使用到的一些變數後就可以逐個比較小陣列中的元素,將小的數字放到臨時陣列中,**如下:

while (i <= centerindex && j <= endindex)  else 

index++; //記得讓臨時陣列的的索引遞增,這樣才能不斷地給臨時陣列中補充數值

}

但會存在下面的情況:

從上圖可以看出,最終右邊的陣列會先被比較完,在右邊的陣列全部被放入到臨時陣列後,左邊還剩餘7和8,此時上面提到的迴圈會跳出,因為兩邊總會有個陣列存在索引越界,從而跳出上面提到的迴圈;所以還需要乙個迴圈來將剩餘的變數放入臨時陣列,**如下:

while (i <= centerindex)
該迴圈是左邊的陣列剩餘,右邊剩餘的話迴圈**如下:

while (j <= endindex)
所有**就實現了對兩個陣列的合併,之後將臨時陣列中的各個元素依次拷貝到在原始陣列所在位置即可

for (int k = 0; k < temparr.length; k++)
通過上述所有**就完成了即合併的過程,將合併方法定義完成後,就需要定義拆分方法,因為要先將原始陣列逐層拆分,拆分到每個陣列中只含有乙個元素,才能進行合併,拆分**如下:

private static void chaifen(int arr, int startindex, int endindex) 

}

拆分通過遞迴實現,所以歸併排序完成

歸併排序**示例:

public class mytest ;

chaifen(arr, 0, arr.length - 1);

system.out.println(arrays.tostring(arr));

}private static void chaifen(int arr, int startindex, int endindex)

}private static void mergemethod(int arr, int startindex, int centerindex, int endindex) else

index++;

}while (i <= centerindex)

while (j <= endindex)

for (int k = 0; k < temparr.length; k++) }}

以上就是關於歸併排序的講

歸併排序 Java實現

歸併排序 mergesort 1 思想 多次將兩個或兩個以上的有序表合併成乙個新的有序表。2 演算法時間複雜度 最好的情況下 一趟歸併需要n次,總共需要logn次,因此為o n logn 最壞的情況下,接近於平均情況下,為o n logn 說明 對長度為n的檔案,需進行logn 趟二路歸併,每趟歸併...

Java實現歸併排序

剛開始接觸歸併排序的時候,感覺挺困難的,但是仔細的分析之後,就會發現它的原理還是蠻簡單的 就是借助另外的乙個陣列空間將左右兩側 從中間mid處劃分 已經排序好的原陣列轉到新的陣列空間。如下圖所示 轉移操作時,就是左右所指的資料進行比較,將較小的資料 由小到大排序 儲存到新的陣列空間。如下圖所示 了解...

Java實現歸併排序

思想就是 將陣列分成兩個陣列,如果兩個陣列的元素都是有序的,那麼就可以很方便的將這兩組資料歸併。如果沒有序繼續將兩組陣列分組,以此類推,當組內只有乙個資料時,認為這個小組內已經有序,然後合併相鄰兩個小組就可以。package sort 歸併排序 2015 05 31 public class mer...