排序演算法之 歸併排序
阿新 • • 發佈:2018-12-09
這一篇要總結的是歸併排序,這也是七大排序的最後一種排序演算法。
首先來看一下歸併排序(Merge Sort) 的基本原理。它的原理是假設初始序列有n個元素,則可以看成是n個有序的子序列,每個子序列的長度為1,然後兩兩歸併,得到n/2個長度為2或1的有序子序列;再兩兩歸併,…… ,如此重複,直至得到一個長度為n的有序序列為止,這種排序方法就稱為歸併排序。
1、歸併排序的示意圖
下面用示意圖來說明歸併排序的過程:
圖一:
圖二:
2、歸併排序的程式碼
MergeSort.java
public class MergeSort { public static void main(String[] args) { int[] list = {50, 10, 90, 30, 70}; System.out.println("************歸併排序************"); System.out.println("排序前:"); display(list); System.out.println(""); System.out.println("排序後:"); mergeSort(list, 0, list.length - 1); display(list); } /** * 歸併排序演算法 * * @param list 待排序的列表 * @param tempList 臨時列表 * @param head 列表開始位置 * @param rear 列表結束位置 */ public static void mergeSort(int[] list, int head, int rear) { if (head < rear) { // 取分割位置 int middle = (head + rear) / 2; // 遞迴劃分列表的左序列 mergeSort(list, head, middle); // 遞迴劃分列表的右序列 mergeSort(list, middle + 1, rear); // 列表的合併操作 merge(list, head, middle + 1, rear); } } /** * 合併操作(列表的兩兩合併) * * @param list * @param tempList * @param head * @param middle * @param rear */ public static void merge(int[] list, int head, int middle, int rear) {
int[] temp = new int[high-low+1]; int i= low; int j = mid+1; int k=0; // 把較小的數先移到新陣列中 while(i<=mid && j<=high){ if(a[i]<a[j]){ temp[k++] = a[i++]; }else{ temp[k++] = a[j++]; } } // 把左邊剩餘的數移入陣列 while(i<=mid){ temp[k++] = a[i++]; } // 把右邊邊剩餘的數移入陣列 while(j<=high){ temp[k++] = a[j++]; } // 把新陣列中的數覆蓋nums陣列 for(int x=0;x<temp.length;x++){ a[x+low] = temp[x]; } } /** * 遍歷列印 */ public static void display(int[] list) { System.out.println("********展示開始********"); if (list != null && list.length > 0) { for (int num : list) { System.out.print(num + " "); } System.out.println(""); } System.out.println("********展示結束********"); } }
執行結果: