1. 程式人生 > 其它 >java實現歸併排序

java實現歸併排序

技術標籤:筆記演算法java排序演算法

歸併排序

歸併排序(Merge Sort)是建立在歸併操作上的一種有效,穩定的排序演算法,該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。將已有序的子序列合併,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合併成一個有序表,稱為二路歸併。

基本原理

①申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列
②設定兩個指標,最初位置分別為兩個已經排序序列的起始位置
③比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置

重複步驟③直到某一指標超出序列尾,將另一序列剩下的所有元素直接複製到合併序列尾

程式碼

import java.util.Arrays;

public class MergeSort {
    public static int[] sort(int[] arr, int low, int high) {
        int mid = (low + high) / 2;
        if (low < high) {
            //歸併的實現
            sort(arr, low, mid);
            sort(arr, mid + 1, high);
            merge(arr, low, mid,
high); } return arr; } public static void merge(int[] arr1, int low, int mid, int high) { int[] t = new int[high - low + 1]; int i = low;// 建立左指標 int j = mid + 1;// 建立右指標 int k = 0; //逐個歸併 //先將較小的數移到新陣列中 while (i <= mid &&
j <= high) { if (arr1[i] <= arr1[j]) { t[k++] = arr1[i++]; } else { t[k++] = arr1[j++]; } } //再將左邊剩餘的數移入陣列 while (i <= mid) { t[k++] = arr1[i++]; } //再把右邊邊剩餘的數移入陣列 while (j <= high) { t[k++] = arr1[j++]; } //最後讓新陣列中的數拷貝到arr陣列中 for (int k1 = 0; k1 < t.length; k1++) { arr1[k1 + low] = t[k1]; } } // 歸併排序的實現 public static void main(String[] args) { int[] arr2 = {17,8,45,-5,-92,41,19,33,-2}; System.out.println("原陣列為:" ); System.out.println(Arrays.toString(arr2)); MergeSort.sort(arr2, 0, arr2.length-1); System.out.println("排序後的陣列為:"); System.out.println(Arrays.toString(arr2)); } }

執行結果為:
在這裡插入圖片描述