Java归并排序

news/2024/5/17 19:01:52 标签: 归并排序, java

归并排序就是将2个有序的序列合并起来,其时间复杂度为O(nlgn),而且它是一种稳定的排序,它的缺点是需要额外n的空间来辅助排序。

java实现">接下来看其Java实现

java">public class MergeSort {

    public static void main(String[] args) {
        Integer[] arr = {1, 6, 9, 3, 2, 11, 15, 4};
        mergeSort(arr);

        Arrays.sort(arr);
    }

    public static void mergeSort(Integer[] arr) {
        sort(arr, 0, arr.length - 1);
    }

    public static void sort(Integer[] arr, int left, int rigth) {
        if (left >= rigth) {
            return;
        }

        int center = (left + rigth) / 2;

        //对左边的进行递归排序
        sort(arr, left, center);

        //右边进行递归排序
        sort(arr, center + 1, rigth);

        //两边排序好的进行合并
        merge(arr, left, center, rigth);

        print(arr);
    }

    javadoc">/**
     * 合并
     *javadoctag"> @param arr
     *javadoctag"> @param left
     *javadoctag"> @param center
     *javadoctag"> @param right
     */
    public static void merge(Integer[] arr, int left, int center, int right) {
        //辅助数组
        Integer[] aux = new Integer[arr.length];

        //辅助数组下标
        int auxIndex = left;

        //存储左边下标
        int temp = left;

        //中间的位置
        int mid = center;

        center += 1;

        //遍历比较直到有一边的数组比较完成
        while (left <= mid && center <= right) {
            if (arr[left] <= arr[center]) {
                aux[auxIndex++] = arr[left++];
            } else {
                aux[auxIndex++] = arr[center++];
            }
        }

        //下面2个while是将没有合并完成的一边放入数组
        while (left <= mid) {
            aux[auxIndex++] = arr[left++];
        }

        while (right >= (center)) {
            aux[auxIndex++] = arr[center++];
        }

        //将排序好的数组放回原数组中
        while (temp <= right) {
            arr[temp] = aux[temp++];
        }

    }

    javadoc">/**
     * 打印数组
     *javadoctag"> @param arr
     */
    public static void print(Integer[] arr) {
        for (Integer a : arr) {
            System.out.print(a + ", ");
        }
        System.out.println();
    }
}

过程就是递归排序两边的序列,然后将排序好的两边序列进行合并。

归并排序">JDK中改进过的归并排序

jdk中的工具类对数组和list进行的排序便是改进过的归并排序

private static void mergeSort(Object[] src,
                  Object[] dest,
                  int low,
                  int high,
                  int off) {
    int length = high - low;

    // 数组小于7时将使用插入排序
        if (length < INSERTIONSORT_THRESHOLD) {
            for (int i=low; i<high; i++)
                for (int j=i; j>low &&
             ((Comparable) dest[j-1]).compareTo(dest[j])>0; j--)
                    swap(dest, j, j-1);
            return;
        }

        //从中间分两部分进行递归
        int destLow  = low;
        int destHigh = high;
        low  += off;
        high += off;
        int mid = (low + high) >>> 1;
        mergeSort(dest, src, low, mid, -off);
        mergeSort(dest, src, mid, high, -off);

       //如果一边最大的小于另一边最小的,直接合并
        if (((Comparable)src[mid-1]).compareTo(src[mid]) <= 0) {
            System.arraycopy(src, low, dest, destLow, length);
            return;
        }

        // 将两边的序列进行合并
        for(int i = destLow, p = low, q = mid; i < destHigh; i++) {
            if (q >= high || p < mid && ((Comparable)src[p]).compareTo(src[q])<=0)
                dest[i] = src[p++];
            else
                dest[i] = src[q++];
        }
    }

http://www.niftyadmin.cn/n/1694928.html

相关文章

IDEA的最常见快捷键

一 代码之间的跳转 ctrlalt [ &#xff08;]&#xff09; 在多个project跳转ctrlalt左&#xff08;右&#xff09; 在光标停留的地方跳转 AltShiftC 打开最近修改的详情CtrlE 打开最近浏览的文件 二 查看代码 CtrlF12 打开类的结构CtrlShiftf 全局搜索Ctrlf 单个文件搜索altf7 …

网站开启https之路

1、介绍HTTPS&#xff08;全称&#xff1a;Hypertext Transfer Protocol over Secure Socket Layer&#xff09;&#xff0c;是以安全为目标的HTTP通道&#xff0c;简单讲是HTTP的安全版。即HTTP下加入SSL层&#xff0c;HTTPS的安全基础是SSL&#xff0c;因此加密的详细内容就需…

启动网站调试提示 HTTP 错误 403.14 – Forbidden Web 服务器被配置为不列出此目录的内容。

启动网站调试提示 HTTP 错误 403.14 – Forbidden Web 服务器被配置为不列出此目录的内容。 解决方案第一种.在网站的配置文件里添加第二种.ISS管理界面修改 解决方案 第一种.在网站的配置文件里添加 <system.webServer><directoryBrowse enabled"true" /&…

angular-cli ng build正常,ng build -prod报错怎么解决?

如题&#xff0c;版本信息&#xff1a; imageng build -prod报错&#xff1a;报的全是这种错&#xff0c;但是ng build就是正常的&#xff0c;难道不能AOT&#xff1f; imagean按照错误提示修改&#xff0c;继续打包

【刷题笔记】LeetCode 48. Rotate Image

题意 原地顺时针翻转一个 n*n 的矩阵 图解 下面例子中用 5*5 矩阵做示例&#xff0c;如下图&#xff0c;我们要把该矩阵顺时针翻转90度&#xff0c;并且不能使用另外的矩阵空间来暂存数据&#xff0c;而是原地改变矩阵中数值。 我的想法是这样的&#xff1a;找出翻转的下标变换…

列数据库 转

转 http://www.csdn.net/article/2012-05-31/2806184 最早的商业列式数据库是在1995年发布的Sybase IQ&#xff0c;但是一直到1999年左右才慢慢稳定到能够投入生产环境。现在的大多数分析型数据库都是在2003-2005年从Postgresql分支出来的。这篇文章解释介绍列式数据库的几大特…

ZT 二叉树的非递归遍历

ZT 二叉树的非递归遍历二叉树的非递归遍历 二叉树是一种非常重要的数据结构&#xff0c;很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树&#xff0c;有前序、中序以及后序三种遍历方法。因为树的定义本身就 是递归定义&#xff0c;因此采用递归的方法去实现树的三…

[Erlang 0076] Erlang Shell一个怪问题

最近一直在忙,偶尔有点时间在读书,补充一下能量;最近在学习 程序设计语言-实践之路 非常感慨,之前误打误撞的一点所得原来有一个更系统,完整的知识体系;于是沉下心来,慢慢吸收.像北上广这样的城市快速的代谢着我们的精力和知识,不容懈怠,不过倒也不必急躁,如果心浮气躁,效果必然…