歸併排序--逐漸簡潔

每當看到簡潔的代碼時,我都一頭霧水,,,只好先翻譯成我能理解的幼兒園水平。

放一個超級好理解的博主的講解

https://www.cnblogs.com/chengxiao/p/6194356.html

 遞歸+分治

package sort;

import com.sun.xml.internal.fastinfoset.util.CharArrayIntMap;

public class MergeSortTest {
    private static void mergeSort(int[] arr) {
        if (arr == null || arr.length <= 1) {
            return;
        }
        int[] newArray = new int[arr.length];
        mergeSort(arr, 0, arr.length - 1, newArray);
    }

    private static void mergeSort(int[] arr, int left, int right, int[] newArray) {
        //base case 遞歸終止條件
        if (left >= right) {
            return;
        }
        //分
        //防止越界
        int mid = left + (right - left) / 2;
        //治
        mergeSort(arr, left, mid, newArray);
        mergeSort(arr, mid + 1, right, newArray);
        //輔助的Array

        for (int i = left; i <= right; i++) {
            newArray[i] = arr[i];
        }
        //合
        int i = left;
        int j = mid + 1;
        int k = left;
        /*要注意,這裏的等於號跟哪邊,會影響這個排序算法的穩定性。指針 i 指的是左邊的元素,遇到相等的元素也會先拷貝下來,所以左邊的元素一直在左邊,維持了相對順序,所以就是穩定的。*/
        while (i <= mid && j <= right) {
            if (newArray[i] <= newArray[j]) {
                arr[k] = newArray[i];
                //一起向右走
                k++;
                i++;
            } else if (newArray[i] > newArray[j]) {
                arr[k] = arr[j];
                k++;
                j++;
            }
        }
        //和上面對應
        while (i <= mid) {
            arr[k++] = newArray[i++];
        }
    }

    public static void main(String[] args) {
        int[] a = {3, 4, 5, 8, 2, 9, 1};
        mergeSort(a);
        for (int i : a) {
            System.out.println(i);
        }
    }
}
package sort;

import com.sun.xml.internal.fastinfoset.util.CharArrayIntMap;

public class MergeSortTest {
    private static void mergeSort(int[] arr) {
        if (arr == null || arr.length <= 1) {
            return;
        }
        int[] newArray = new int[arr.length];
        mergeSort(arr, 0, arr.length - 1, newArray);
    }

    private static void mergeSort(int[] arr, int left, int right, int[] newArray) {
        //base case 遞歸終止條件
        if (left >= right) {
            return;
        }
        //分
        //防止越界
        int mid = left + (right - left) / 2;
        //治
        mergeSort(arr, left, mid, newArray);
        mergeSort(arr, mid + 1, right, newArray);
        //輔助的Array

        for (int i = left; i <= right; i++) {
            newArray[i] = arr[i];
        }
        //合
        int i = left;
        int j = mid + 1;
        int k = left;
        /*要注意,這裏的等於號跟哪邊,會影響這個排序算法的穩定性。不清楚穩定性的同學快去翻一下上一篇文章啦~
那像我代碼中這種寫法,指針 i 指的是左邊的元素,遇到相等的元素也會先拷貝下來,所以左邊的元素一直在左邊,維持了相對順序,所以就是穩定的。*/
        while (i <= mid && j <= right) {
            if (newArray[i] <= newArray[j]) {
                arr[k++] = newArray[i];
                //一起向右走
              /*  k++;
                i++;*/
            } else if (newArray[i] > newArray[j]) {
                arr[k++] = arr[j++];
              /*  k++;
                j++;*/
            }
        }
        //和上面對應
        while (i <= mid) {
            arr[k++] = newArray[i++];
        }
    }

    public static void main(String[] args) {
        int[] a = {3, 4, 5, 8, 2, 9, 1};
        mergeSort(a);
        for (int i : a) {
            System.out.println(i);
        }
    }
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章