十大经典排序算法之归并排序

yumo6662个月前 (03-09)技术文章70

归并排序(Merge Sort)采用的是经典的分治思想,分治法将序列递归地把平均分割成两半,在保持元素顺序的同时将上一步得到的子序列集成到一起。

算法特性

  • 稳定性

归并排序是一种稳定的排序算法。

  • 时间复杂度

归并排序的最好,最坏,平均时间复杂度均为O(nlogn)。。

  • 空间复杂度

归并排序的排序在每一次合并时需要额外的空间,临时内存空间最大也不会超过 n 个数据的大小,所以空间复杂度是 O(n)。

算法步骤

1.申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列

2.设定两个指针,最初位置分别为两个已经排序序列的起始位置

3.比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置

4.重复步骤3直到某一指针到达序列尾

5.将另一序列剩下的所有元素直接复制到合并序列尾

动画演示

代码实现

Java代码:

public static int[] mergeSort(int[] sourceArray) {
    if (sourceArray == null || sourceArray.length < 2 return sourcearray int length='sourceArray.length;' int array='Arrays.copyOf(sourceArray,' length processarray 0 length - 1 return array public static void processint array int left int right if left>= right) {
        return;
    }

    int mid = left + ((right - left) >> 2);
    process(array, left, mid);
    process(array, mid + 1, right);
    partition(array, left, mid, right);
}

public static void partition(int[] array, int left, int mid, int right) {
    int[] help = new int[right - left + 1];
    int p1 = left;
    int p2 = mid + 1;
    int index = 0;
    while (p1 <= mid && p2 <= right helpindex='array[p1]'> array[p2] ? array[p2++] : array[p1++];
    }

    while (p1 <= mid) {
        help[index++] = array[p1++];
    }

    while (p2 <= right) {
        help[index++] = array[p2++];
    }

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

private static void swap(int[] array, int i, int j) {
    int temp = array[i];
    array[i] = array[j];
    array[j] = temp;
}

相关文章

Java 动态调试技术原理及实践

调试是发现和减少计算机程序或电子仪器设备中程序错误的一个过程。最常用的断点调试技术会在断点位置停顿,导致应用停止响应。本文将介绍一种Java动态调试技术,希望能对大家有帮助。同时也欢迎读者朋友们一起交...

iOS UIView动画实践(一):揭开Animation的神秘面纱

前言在一个看脸的社会中,不论什么事物,长得好看总是能多吸引一些目光。App同样不例外,一款面相不错的App就算功能已经被轮子千百遍,依然会有人买账,理由就是看得顺眼,于是平面设计人员越来越被重视。白驹...

强大 WebView2 + 不用写 JavaScript 的 htmx.js 「小轻快」开发桌面程序

WebView2 是越来越香了。WebView2 不但是 Win11 自带的系统组件,Win10 也已经自动推送安装。即使是少量没有安装 WebView2 的系统 —— 使用 aardio 中的 we...

看动画学算法之:排序-快速排序

简介快速排序也采用的是分而制之的思想。那么快速排序和归并排序的区别在什么地方呢?归并排序是将所有的元素拆分成一个个排好序的数组,然后将这些数组再进行合并。而快速排序虽然也是拆分,但是拆分之后的操作是从...

第二弹!安排!安利几个让你爽到爆的IDEA必备插件

作者:Guide哥 来自:JavaGuide 大家好,我是Guide哥。上一篇关于IDEA插件推荐的文章:《第一弹!安排!安利10个让你爽到爆的IDEA必备插件!》收到了很多小伙伴的好评,时隔大半个月...