归并排序

112 阅读1分钟

1,归并排序的思想

采用经典的分治法,先将数组进行拆分成小的数组,再按照左右两边的小数组顺序合并,再将剩余的顺序拷贝,最终再将临时的数组拷贝回原始数组中去

2,归并排序示意图

clipboard.png

clipboard1.png

3,归并排序代码

 * 将数组拆分,也就是分
 * @param array
 * @param left
 * @param right
 * @param temp
 */
public static void mergeSort(int[] array, int left, int right, int[] temp) {
    if (left < right) {
        int middle = (left + right) / 2;
        //左递归分解
        mergeSort(array, left, middle, temp);
        //右递归分解
        mergeSort(array, middle + 1, right, temp);
        //合并
        merge(array, left, right, temp);
    }
}

/** 归并代码,也就是治
 * @param array  待排序的数组
 * @param left   左索引
 * @param middle 中间值
 * @param right  右索引
 * @param temp   临时数组
 */
public static void merge(int[] array, int left, int right, int[] temp) {
    int mid = (left + right) / 2;
    int i = left;
    int j = mid + 1;
    //指向临时数组的索引
    int t = 0;
    //第一步:先将左右两边的数组按照有序的顺序填充到temp数组中
    while (i <= mid && j <= right) {
        if (array[i] < array[j]) {
            temp[t] = array[i];
            i++;
            t++;
        } else {
            temp[t] = array[j];
            j++;
            t++;
        }
    }
    //第二步:将左右两边数组中剩余的数据依次填充到temp数组中
    while (i <= mid) {
        temp[t] = array[i];
        i++;
        t++;
    }
    while (j <= right) {
        temp[t] = array[j];
        j++;
        t++;
    }
    //第三步:最后进行数组的归并,并不是每次都拷贝所有的数据
    t = 0;
    int index = left;
    while (index <= right) {
        array[index] = temp[t];
        t++;
        index++;
    }
}