1. 程式人生 > >java排序演算法(四)------歸併排序

java排序演算法(四)------歸併排序

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

在這裡插入圖片描述 合併相鄰有序子序列 在這裡插入圖片描述 程式碼實現:

public class MergeSort {

    public static void sort(int[] arr) {
        int[] temp = new int[arr.length];
        sort(arr,0,arr.length - 1,temp);
    }
public static void sort(int[] arr, int left, int right, int[] temp) { if (left < right) { // 找出中間索引 int mid = (right + left)/2; // 對左邊陣列進行遞迴 sort(arr,left,mid,temp); // 對右邊陣列進行遞迴 sort(arr,mid+1,right,temp); // 合併
merge(arr, left, mid, right, temp); } } /** * 將兩個陣列進行歸併,歸併前面2個數組已有序,歸併後依然有序 * * @param arr 陣列物件 * @param left 左陣列的第一個元素的索引 * @param mid 左陣列的最後一個元素的索引,center+1是右陣列第一個元素的索引 * @param right 右陣列最後一個元素的索引 */ private
static void merge(int[] arr, int left, int mid, int right, int[] temp) { int i = left; //右指標 int j = mid + 1; //左指標 int t = 0; //臨時陣列指標 while (i <= mid && j <= right) { // 從兩個陣列中取出最小的放入臨時陣列 if (arr[i] <= arr[j]) { temp[t++] = arr[i++]; }else{ temp[t++] = arr[j++]; } } // 剩餘部分依次放入臨時陣列(實際上兩個while只會執行其中一個) while (i <= mid) { temp[t++] = arr[i++]; } while (j <= right) { temp[t++] = arr[j++]; } t = 0; // 將臨時陣列中的內容拷貝回原陣列中 // (原left-right範圍的內容被複制回原陣列) while(left <= right){ arr[left++] = temp[t++]; } } }