IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> Day17归并排序 -> 正文阅读

[数据结构与算法]Day17归并排序

一、什么是归并排序

归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治**(divide-and-conquer)策略(分治法将问题(divide)成一些小的问题然后递归求解,而治**(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。

二、归并排序思想示意图

image-20220115214642301

一共需要合并 nums.length - 1次,带入到此图中就是 7 次

就拿 4 5 7 8这组和 1 2 3 6这组的合并举例说明合并过程(也就是最后一次合并)

image-20220115215027118

三、代码实现

package com.fafa.sort;

import java.util.Arrays;

/**
 * 归并排序(分治思想,先分而后治)
 *
 * @author Sire
 * @version 1.0
 * @date 2022-01-15 17:22
 */
public class MergeSort {
    public static void main(String[] args) {
        int[] arr = {8, 4, 5, 7, 1, 3, 6, 2};
        int[] temp = new int[arr.length];
        mergeSort(arr, 0, arr.length - 1, temp);
        System.out.println("排序后的结果:" + Arrays.toString(arr));
    }
    /**
     * 分割 + 合并
     * 思路:
     * 先将数组元素分隔开(二分处理,直到分成单个元素)
     * 分割完就开始进行合并了(运用递归的栈的机制特性,后进先出,因为是最后被分割成单个元素的,所以肯定是先合并单个元素的)
     */
    public static void mergeSort(int[] arr, int left, int right, int[] temp) {
        // 首先需要先分割 (终止条件就是 left == right)
        if (left < right) {
            int mid = (left + right) / 2;
            // 向左进行递归分解
            mergeSort(arr, left, mid, temp);
            // 向右进行递归分解
            mergeSort(arr, mid + 1, right, temp);
            // 然后进行合并( 根据栈的特性思考哦 )
            merge(arr, left, mid, right, temp);
        }

    }
    /**
     * 合并(分割完后进行的操作)
     *
     * @param arr   原数组
     * @param left  左索引
     * @param mid   中间索引
     * @param right 右索引
     * @param temp  额外的空间
     */
    public static void merge(int[] arr, int left, int mid, int right, int[] temp) {
        // 左边有序序列的初始索引
        int l = left;
        // 右边有序序列的初始索引
        int r = mid + 1;
        // temp 数组的下标
        int t = 0;
        // 1、先把左右两边(有序)数组按照规则填充到temp数组中
        // 2、直到有一边处理完为止
        while (l <= mid && r <= right) {
            // 如果左边的数 比 右边的大
            if (arr[l] > arr[r]) {
                temp[t] = arr[r];
                r++;
            }
            // 反之
            else {
                temp[t] = arr[l];
                l++;
            }
            t++;
        }
        // 3、然后把另外一边的剩余数字全部拷贝到 temp
        // 假如左边有序数组还有数字未合并
        while (l <= mid) {
            temp[t] = arr[l];
            l++;
            t++;
        }
        // 假如右边有序数组还有数字未合并
        while (r <= right) {
            temp[t] = arr[r];
            r++;
            t++;
        }
        // 4、最后再把 temp 的结果 拷贝到 原数组即可
        // 注意:并不是每一次都需要拷贝所有的temp,因为只有最一次是拷贝所有,其余都是部分拷贝
        // 重置temp的下标
        t = 0;
        // 当前arr的起始下标
        int tempLeft = left;
        // 第一次合并 tempLeft = 0 , right = 1 //  tempLeft = 2  right = 3 // tempLeft = 0 right = 3
        // 最后一次 tempLeft = 0  right = 7
        while (tempLeft <= right) {
            arr[tempLeft] = temp[t];
            t++;
            tempLeft++;
        }
    }
}

四、测试结果

和希尔排序、快速排序对比

三种排序算法进行对比,发现,数据越大快速排序越快(1.3s),归并次之(1.7s),希尔最慢(2.7s)(数据量大概在800万左右);

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-01-16 13:19:22  更:2022-01-16 13:20:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 19:26:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码