1. 程式人生 > >歸併排序java示例

歸併排序java示例

歸併排序是建立在歸併操作上的一種有效的排序演算法,該演算法採用分治法的思想。分:將待排序序列拆分成一個個子序列。治:將已有序的子序列合併,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。

可以採用遞迴的方式將待排序序列拆分,然後進行歸併操作。

歸併操作的工作原理如下: 第一步:申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列。 第二步:設定兩個指標,最初位置分別為兩個已經排序序列的起始位置。 第三步:比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置。 重複步驟三,直到某一指標超出序列尾。 將另一序列剩下的所有元素直接複製到合併序列尾。

java示例:

public class MergeSort {

    public static void main(String[] args) {
        int[] arr = {1,3,2,6,4,66,32,65,34,67,45,67,78,34,56};
        System.out.println("排序前:");
        System.out.println(Arrays.toString(arr));
        sort(arr);
        System.out.println("排序後:");
        System.out.println(Arrays.toString(arr));
    }

    public static void sort(int[] arr) {
        sort(arr, 0, arr.length - 1);
    }

    public static void sort(int[] arr, int left, int right) {
        if (left < right) {
            int mid = (left + right)/2;
            sort(arr, left, mid);//左邊歸併排序
            sort(arr, mid + 1, right);//右邊歸併排序
            merge(arr, left, mid, right);//將兩個有序子數組合並處理
        }
    }

    private static void merge(int[] arr, int left, int mid, int right) {
        int i = left;
        int j = mid + 1;
        int t = 0;
        int[] temp = new int[right - left + 1];//定義臨時資料,長度為兩個子陣列之和
        while (i <= mid && j <= right) {
            if (arr[i] <= arr[j]) {
                temp[t++] = arr[i++];
            } else {
                temp[t++] = arr[j++];
            }
        }
        while (i <= mid) {//左邊剩餘元素放到臨時數組裡
            temp[t++] = arr[i++];
        }
        while (j <= right) {//右邊剩餘元素放到臨時數組裡
            temp[t++] = arr[j++];
        }
        t = 0;
        while (left <= right) {//將臨時陣列中的元素全部拷貝到原陣列中
            arr[left++] = temp[t++];
        }
    }
}

執行結果:

排序前:
[1, 3, 2, 6, 4, 66, 32, 65, 34, 67, 45, 67, 78, 34, 56]
排序後:
[1, 2, 3, 4, 6, 32, 34, 34, 45, 56, 65, 66, 67, 67, 78]

Process finished with exit code 0