归并排序速记

发布于:2024-11-02 ⋅ 阅读:(15) ⋅ 点赞:(0)

归并排序(Merge Sort)其基本思想是将数组分成若干个子数组,分别对每个子数组进行排序,然后再将这些子数组合并成一个完整的、有序的数组。归并排序的主要优点是其稳定性(即相等元素的相对顺序在排序前后不会改变)和高效性(时间复杂度为O(n log n))。

下面是归并排序的详细步骤:

  1. 分解:将数组从中间分成两个子数组,如果数组长度为奇数,则其中一个子数组会多一个元素。
  2. 递归排序:对这两个子数组分别进行归并排序。
  3. 合并:将两个已排序的子数组合并成一个完整的、有序的数组。

private static void mergeSort(int[] arr, int left, int right) {
    if (left >= right) {
        return;
    }
    int middle = (left + right) >>> 1;
    mergeSort(arr, left, middle);
    mergeSort(arr, middle + 1, right);
    //每个小组走完左边和右边就就行排序,比如(0,1)走完(0,0)和(1,1),就会走 merge(arr, 0, 0, 1);
    merge(arr, left, middle, right);
}
/**
 * 合并数组-不是递归
 *
 * @param arr
 * @param left
 * @param middle
 * @param right
 */
private static void merge(int[] arr, int left, int middle, int right) {
    int s1 = left;
    int s2 = middle + 1;
    int location = 0;
    int[] temArr = new int[right - left + 1];

    while (s1 <= middle && s2 <= right) {
        if (arr[s1] < arr[s2]) {
            temArr[location] = arr[s1];
            s1++;
        } else {
            temArr[location] = arr[s2];
            s2++;
        }
        location++;
    }

    while (s1 <= middle) {
        temArr[location] = arr[s1];
        s1++;
        location++;
    }
    while (s2 <= right) {
        temArr[location] = arr[s2];
        s2++;
        location++;
    }


    for (int i = 0; i < temArr.length; i++) {
        arr[left + i] = temArr[i];
    }
}