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

echo编辑整理,欢迎转载,转载请声明文章来源。欢迎添加echo微信(微信号:t2421499075) 交流学习。


什么是归并排序

归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

动图演示

在这里插入图片描述

声明图片来源菜鸟教程

Java代码实现

public class Test {

    public static void main(String[] args) {

        int[] arr = {1, 3, 6, 9, 2, 5, 11, 4, 8};
        print("原数组: ", arr);
        int[] sort = sort(arr);
        print("排序后的数组: ", sort);
    }

    private static int[] sort(int[] sourceArray) {
        // 对 arr 进行拷贝,不改变参数内容
        int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);

        if (arr.length < 2) {
            return arr;
        }
        int middle = (int) Math.floor(arr.length / 2);

        int[] left = Arrays.copyOfRange(arr, 0, middle);
        int[] right = Arrays.copyOfRange(arr, middle, arr.length);

        return merge(sort(left), sort(right));
    }

    protected static int[] merge(int[] left, int[] right) {
        int[] result = new int[left.length + right.length];
        int i = 0;
        while (left.length > 0 && right.length > 0) {
            if (left[0] <= right[0]) {
                result[i++] = left[0];
                left = Arrays.copyOfRange(left, 1, left.length);
            } else {
                result[i++] = right[0];
                right = Arrays.copyOfRange(right, 1, right.length);
            }
        }

        while (left.length > 0) {
            result[i++] = left[0];
            left = Arrays.copyOfRange(left, 1, left.length);
        }

        while (right.length > 0) {
            result[i++] = right[0];
            right = Arrays.copyOfRange(right, 1, right.length);
        }

        return result;
    }

    private static void print(String str, int[] arr) {
        for (int i = 0; i <= arr.length - 1; i++) {
            if (i == 0) {
                System.out.print(str + "[" + arr[i] + ", ");
            } else if (i == arr.length - 1) {
                System.out.print(arr[i] + "]");
            } else {
                System.out.print(arr[i] + ", ");
            }
        }
        System.out.println();
    }

}

核心原理

分而治之

算法过程如下

①把 n 个记录看成 n 个长度为1的有序子表;
②进行两两归并使记录关键字有序,得到 n/2 个长度为 2 的有序子表;
③重复第②步直到所有记录归并成一个长度为 n 的有序表为止。
算法的实现不像图示那样简单,现分三步来讨论。首先从宏观上分析,首先让子表表长 L=1 进行处理;不断地使 L=2*L ,进行子表处理,直到 L>=n

时间复杂度

O(nlogn)

归并排序的优缺点

优点:归并排序是一种稳定的排序。
缺点:空间复杂度高

适用场景

适合给大规模的数据排序


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

相关文章

elasticsearch-dump 迁移es数据 (elasticdump)

elasticsearch 部分查询语句 # 获取集群的节点列表&#xff1a; curl localhost:9200/_cat/nodes?v# 列出所有索引&#xff1a; curl localhost:9200/_cat/indices?v创建一个名为“customer”的索引&#xff0c;然后再查看所有的索引&#xff1a; curl -X PUT localhost:9200…

算法篇-十大经典排序算法之快速排序

echo编辑整理&#xff0c;欢迎转载&#xff0c;转载请声明文章来源。欢迎添加echo微信(微信号&#xff1a;t2421499075) 交流学习。 什么快速排序&#xff1f; 快速排序&#xff08;Quicksort&#xff09;是对冒泡排序的一种改进。 快速排序由C. A. R. Hoare在1960年提出。它的…

ES索引写入性能优化

1、用bulk批量写入 你如果要往es里面灌入数据的话&#xff0c;那么根据你的业务场景来&#xff0c;如果你的业务场景可以支持让你将一批数据聚合起来&#xff0c;一次性写入es&#xff0c;那么就尽量采用bulk的方式&#xff0c;每次批量写个几百条这样子。 bulk批量写入的性能…

算法篇-十大经典排序算法之堆排序

echo编辑整理&#xff0c;欢迎转载&#xff0c;转载请声明文章来源。欢迎添加echo微信(微信号&#xff1a;t2421499075) 交流学习。 什么是堆排序&#xff1f; 堆排序&#xff08;Heapsort&#xff09;&#xff0c;堆排序是利用堆这种数据结构而设计的一种排序算法&#xff0c…

Elasticsearch java API Aggregations 聚合 Bucket

桶聚合编辑 全球聚合编辑 下面是如何使用 Global Aggregation 与Java API。 准备聚合请求编辑 这里有一个例子关于如何创建聚合的要求: AggregationBuilders .global("agg") .subAggregation(AggregationBuilders.terms("genders").fiel…

算法篇-十大经典排序算法之计数排序

echo编辑整理&#xff0c;欢迎转载&#xff0c;转载请声明文章来源。欢迎添加echo微信(微信号&#xff1a;t2421499075) 交流学习。 什么是计数排序 计数排序是一个非基于比较的排序算法&#xff0c;该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数…

rocketmq批量消息投递

rocketmq批量消息投递 批量发送消息可提高传递小消息的性能。同时也需要满足以下特征 批量消息要求必要具有同一topic、相同消息配置不支持延时消息建议一个批量消息最好不要超过1MB大小 示例 小于1MB String topic "BatchTest"; List<Message> messages …

算法篇-十大经典排序算法之桶排序

echo编辑整理&#xff0c;欢迎转载&#xff0c;转载请声明文章来源。欢迎添加echo微信(微信号&#xff1a;t2421499075) 交流学习。 什么是桶排序 首先说一下桶排序的桶是什么概念&#xff0c;这里的“桶”是一个区间范围&#xff0c;里面可以承载一个或多个元素。桶排序的第一…