归并排序(重要)

news/2024/5/17 16:45:52 标签: 算法, 数据结构, 排序算法, java, 归并排序

归并排序

  • 原理:
    • 分解:
    • 合并:
  • 非递归:

原理:

归并排序(mergeSort)是建立在归并操作上的一种有效的排序算法,该算法采用分治法。将以有序的子序列合并,得到一个完全有序的序列,即:先使得每个子序列有序,再使得子序列段间有序。如果将两个有序表合成一个有序表,称为:二路归并。

我们采用二路归并如图演示:
在这里插入图片描述
分解的过程,我们可以借助递归,不停的往下分解,直到只有一个元素分解完成。
合并的过程,就是我们合并两个有序的数组,我们主要是比较两个元素,小的先放,然后放较大的元素。

分解:

java">public static void mergeSort(long[] array) {
        mergeSortRange(array, 0, array.length);
    }

    private static void mergeSortRange(long[] array, int from, int to) {
        if (to - from <= 1) {
            return;
        }
        int mid = (to + from) / 2;
        mergeSortRange(array, from, mid);
        mergeSortRange(array, mid, to);
        
        //合并
        merge(array, from, mid, to);
    }

合并:

java">private static void merge(long[] array, int from, int mid, int to) {
        int size = to - from;
        long[] array2 = new long[size];

        int k1 = from;
        int k2 = mid;
        int k3 = 0;

        while (k1 < mid && k2 < to) {
            if (array[k1] <= array[k2]) {
                array2[k3++] = array[k1++];
            } else {
                array2[k3++] = array[k2++];
            }
        }
        while (k1 < mid) {
            array2[k3++] = array[k1++];
        }
        while (k2 < to) {
            array2[k3++] = array[k2++];
        }
        for (int i = 0; i < size; i++) {
            array[from + i] = array2[i];
        }
    }

非递归:

java">    public static void mergeSort(long[] array) {
        for (int i = 1; i < array.length; i = i * 2) {
            for (int j = 0; j < array.length; j = j + 2 * i) {
                int low = j;
                int mid = j + i;
                if (mid >= array.length) {
                    continue;
                }
                int high = mid + i;
                if (high > array.length) {
                    high = array.length;
                }
                merge(array, low, mid, high);
            }
        }
    }

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

相关文章

排序算法性能分析和海量数据排序问题

排序算法性能分析时间和空间复杂度快速排序的优化海量数据排序问题&#xff1a;时间和空间复杂度 整理&#xff1a; 排序稳定性时间复杂度空间度复杂度最好最坏最好/平均/最坏最好/平均/最坏冒泡排序有序逆序稳定O(n) / O(n2) / O(n2)O(1)插入排序有序逆序稳定O(n) / O(n2) /…

二叉搜索树原理及操作

二叉搜索树原理构建二叉搜索树查找插入删除原理 二叉搜索树&#xff08;Binary Search Tree BST&#xff09; 又称为二叉排序树&#xff0c;它是一颗空树或者具有以下性质&#xff1a; 它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值它的右子树不为空&…

模拟实现HashMap

模拟实现HashMap模拟实现HashMap注意事项关于Set和Map区别&#xff1a;见链接&#xff1a; Set和Map 关于HashTable 见链接&#xff1a; 哈希表 模拟实现HashMap Node&#xff1a; public class Node {public String key;public Integer value;public Node next;public Nod…

SQL查询总结

查询聚合查询聚合函数GROUP BY 子句多次分组聚合HAVING联合查询内连接外连接自连接子查询[NOT] IN[NOT] EXISTSSQL基础语句查询为&#xff1a;SELECT * FROM student;聚合查询 聚合函数 常见的聚合函数有&#xff1a;MAX、MIN、AVG、COUNT、SUM 函数说明COUNT返回查询到数据…

猜数字游戏网页版

猜数字游戏网页版本猜数字游戏页面展示&#xff1a;具体实现&#xff1a;猜数字游戏 实现一个猜数字游戏。 随机产生一个数字&#xff0c;输入数字猜这个数字的大小&#xff0c;直到猜中这个数字。当你输入的这个数字小于这个随机数&#xff0c;提示猜小了&#xff0c;当你输入…

模拟实现红绿灯

模拟实现红绿灯模拟实现红绿灯模拟实现红绿灯 利用HTMLCSSJS实现红绿灯 效果&#xff1a; <!DOCTYPE html> <html lang"zh-hans"><head><meta charset"uft-8"><title>红绿灯</title><style>* {box-sizing: …

JS实现点名功能

JS实现点名功能描述实现对数组操作主要是使用 JS修改/操作DOM树的能力描述 利用JS实现点名功能&#xff0c;当在网页点下点击按钮的时候&#xff0c;随机点名&#xff0c;然后将点过名的同学插入到安全区&#xff08;下次不会点到&#xff09;&#xff0c;但是安全区的名字最多…

Linux部署

Linux部署搭建环境部署搭建环境 # 环境准备的所有命令 yum install -y git # 安装 git yum install -y java-1.8.0-openjdk-devel # 安装 jdk8 yum install -y maven # 安装maven yum install -y mariadb-server # 安装mysql服务器 systemctl start mariadb # 启动mysql服务器 …