排序算法(五)归并排序

排序算法(五 )归并排序

1.算法思路
  归并排序(Merge-Sort)是一种基于二叉堆及分而治之思想的排序算法。即将一个无序序列拆分成 2/n 段无序子序列,然后排序子序列,使子序列有序后再合并为一个有序序列,如“图1 归并排序”所示:

图1 归并排序(静图)

图2 归并排序(动图)

2.复杂度

  • 时间复杂度:O(nlogn)。
  • 空间复杂度:T(n),该算法在排序过程中需要一个辅助数组,也就是说至少同时需要有两个等长的数组。
  • 稳定性:归并排序是稳定算法。

3.代码实现

import java.util.Arrays;

public class MergeSort {


    public static void main(String[] args) {
        int[] array = {9, 11, 3, 6, 5, 2, 8};
        MergeSort mergeSort = new MergeSort(array);
        mergeSort.mergeSort(array, 0, array.length - 1);
        System.out.println(Arrays.toString(array));
    }

    int[] arr;

    public MergeSort(int[] array) {
        // 事先创建一个等长数组,在递归过程中就无需再频繁开辟空间
        arr = new int[array.length];
    }

    /**
     * 递归调用
     * 将数组拆分
     * @param array 原数组
     * @param left 数组中最左边的下标
     * @param right 数组中最右边的下标
     */
    public void mergeSort(int[] array, int left, int right) {
        if (left < right) {
            int mid = (left + right) / 2;
            mergeSort(array, left, mid);
            mergeSort(array, mid + 1, right);
            merge(array, left, mid, right);
        }
    }

    /**
     * 将数组合并
     * @param array 原数组
     * @param left 最左边下标
     * @param mid 中间下标
     * @param right 最右边下标
     */
    public void merge(int[] array, int left, int mid, int right) {
        int l = left; // 左序列指针
        int r = mid + 1; // 右序列指针
        int temp = 0; // 临时指针
        // 拆分出来的两组数据依次循环对比后插入临时数组
        // 当某一方先比较排序完,则无需再比较
        while (l <= mid && r <= right) {
            if (array[l] <= array[r]) {
                arr[temp++] = array[r++];
            } else{
                arr[temp++] = array[l++];
            }
        }
        // 若左边序列还未排序完,则直接将左边数组插入临时数组
        while (l <= mid) {
            arr[temp++] = array[l++];
        }
        // 若右边序列还未排序完,则直接将左边数组插入临时数组
        while (r <= right) {
            arr[temp++] = array[r++];
        }
        // 将刚刚插入临时数组中的数据复制到原数组中
        temp = 0;
        while (left <= right) {
            array[left++] = arr[temp++];
        }
    }
}

你可能感兴趣的:(排序算法(五)归并排序)