归并排序

归并排序算法思想

所谓归并,就是将两个或两个以上的有序表合并成一个新的有序表。有两个已经排好序的有序表A[1]A[n]和B[1]B[m],通过归并把它们合成一个有序表C[1]~C[m+n]。

基本思想:归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。

归并排序算法实现

 private static int[] copy;

    public static void main(String[] args) {
        int[] arr = {3, 3, 3, 3, 3, 3, 4, 3};
        int lo = 0;
        int hi = arr.length - 1;
        //create copy array
        copy = new int[arr.length];
        mergeSortToTop(arr, lo, hi);
        mergeSortToButtom(arr);
        for (int i : arr) {
            System.out.print(i + "  ");
        }

    }

    /**
     * 自顶而上的归并排序
     *
     * @param arr
     * @return
     */
    private static void mergeSortToButtom(int[] arr) {
        int N = arr.length;
        for (int sz = 1; sz < N; sz = sz + sz) {
            for (int lo = 0; lo < N - sz; lo += sz + sz) {
                merge(arr, lo, lo + sz - 1, Math.min(lo + sz + sz - 1, N - 1));
            }

        }
    }

    /**
     * 自顶而下的归并排序
     *
     * @param arr
     * @param lo
     * @param hi
     * @return
     */
    private static void mergeSortToTop(int[] arr, int lo, int hi) {
        if (lo >= hi) return;
        int mid = (lo + hi) / 2;
        mergeSortToTop(arr, lo, mid);
        mergeSortToTop(arr, mid + 1, hi);
        merge(arr, lo, mid, hi);
    }

    /**
     *其实就是两个数组合并
     *
     * @param arr
     * @param lo
     * @param mid
     * @param hi
     */
    private static void merge(int[] arr, int lo, int mid, int hi) {
        int i = lo;
        int j = mid + 1;
        // 将原数组copy到新的数组里
        for (int k = lo; k <= hi; k++) {
            copy[k] = arr[k];
        }
        //分成两半进行排序
        for (int k = lo; k <= hi; k++) {
            if (i > mid) arr[k] = copy[j++];
            else if (j > hi) arr[k] = copy[i++];
            else if (arr[i] > arr[j]) arr[k] = copy[j++];
            else arr[k] = copy[i++];
        }
    }

算法复杂度

1.平均时间复杂度: O(NLogN)
2.最好情况时间复杂度: O(NLogN)
3.最差情况时间复杂度: O(NLogN)
4.所需要额外空间: O(N)

算法稳定性

1.归并排序算法是稳定的

想看完整版算法请点击:归并排序

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好...
    依依玖玥阅读 5,034评论 0 2
  • 归并排序 所谓归并,就是将两个或两个以上的有序表合并成一个新的有序表。如下图所示,有两个已经排好序的有序表A[1]...
    JackChen1024阅读 6,944评论 0 4
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 10,603评论 0 52
  • 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    每天刷两次牙阅读 9,098评论 0 15
  • Ba la la la ~ 读者朋友们,你们好啊,又到了冷锋时间,话不多说,发车! 1.冒泡排序(Bub...
    王饱饱阅读 5,780评论 0 7

友情链接更多精彩内容