7--归并排序

2023-11-03

思想:

将待排序序列分为两个子序列,再将两个子序列递归的继续分下去,直到序列有序,即序列中只有一个元素,再把所有有序子序列逐层合并为一个整体有序序列。(每次合并是将两个有序表合并成一个有序表)。
图示:

在这里插入图片描述
具体实现:

  1. 把待排序序列分为两个子序列,然后让子序列继续分子序列。
  2. 把由同一个序列分出来的两个子序列合并。
  • 申请内存空间,空间大小是两个已排序序列的和,用来暂时存放合并后的序列;
  • 设置两个指针变量,分别指向两个已排序列数组的起始位置;
  • 重复上一步骤直到某一指针到达序列尾;
  • 当一个指针到达序列尾的时候,将另一个序列中的元素直接复制到合并序列的尾部;
  • 将合并序列中的元素复制到原数组合适的位置。
    代码实现:
package www.sort;

import java.util.Arrays;

public class MergeSort {
    public static void main(String[] args) {
        int[] array = {9,2,5,7,3,8,3,6,1};
        mergeSort(array,0,array.length-1);
        System.out.println(Arrays.toString(array));
    }
    public static void mergeSort(int[] array,int left,int right){
        if (left >= right){
            return;
        }
        int mid = left+(right-left)/2;
        mergeSort(array,left,mid);
        mergeSort(array,mid+1,right);
        merge(array,left,right,mid);
    }
    public static void merge(int[] array,int left,int right,int mid){
        int[] extra = new int[array.length];
        int m = mid+1;
        int l = left;
        int x = left;
        while (left <= mid && m <= right){
            if (array[left] <= array[m]){
                extra[x++] = array[left++];
            }else {
                extra[x++] = array[m++];
            }
        }
        while (left <= mid){
            extra[x++] = array[left++];
        }
        while (m <= right){
            extra[x++] = array[m++];
        }
        while (l <= right){
            array[l] = extra[l++];
        }
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

7--归并排序 的相关文章

  • 手把手教python发送邮件

    使用python内置模块 smtplib和email进行邮件发送 其中smtplib模块负责发送邮件 而email模块负责构造邮件内容 一 基本用法介绍 1 smtplib模块 1 引入smtplib模块 import smtplib 2
  • OpenStack之仪表盘服务(Dashboard)

    一 Dashboard的基本 1 概念 OpenStack云计算平台可以通过命令行管理工具使用 或者其他应用通过应用程序接口被其他程序调用 但是都较为麻烦 不够直观 那么Dashboard随机应运而生了 其本质是一个web前端控制台 主要功
  • 【Vue3】跨域问题 [The value of the ‘Access-Control-Allow-Origin‘ header in the response must not be the..]

    场景 vue 项目中 axios 请求数据的时候请求失败 出现跨域问题 报错信息 The value of the Access Control Allow Origin header in the response must not be
  • Maven报错无法解析插件

    某天本人创建好一个Maven项目写导入依赖的时候给我跳出一个错误 说一些Maven插件无法解析 虽说这是个小问题 但这个问题直接卡了一个小时的说 具体出错效果可以参考下图 注意哦 我这是在没网的情况下 有网的话maven会直接给你在中央仓库

随机推荐

  • 【LeetCode每日刷题】一行代码实现《2的幂》

    一 题目 给你一个整数 n 请你判断该整数是否是 2 的幂次方 如果是 返回 true 否则 返回 false 如果存在一个整数 x 使得 n 2x 则认为 n 是 2 的幂次方 输入 输入一个整数 输出 输出True或者False 二 例
  • matlab语音去除白噪声_基于的MATLAB的语音加噪去噪处理

    龙源期刊网 http www qikan com cn 基于的 MATLAB 的语音加噪去噪处理 作者 张大林 何威 李瑶瑶 来源 中国科技博览 2019 年第 01 期 摘 要 语音是语言的声学表现 是人类交流信息最自然 最有效 最方便的
  • 【SpringCloud】Spring cloud Alibaba Sentinel 降级规则

    文章目录 1 概述 2 服务降级 2 1 RT 2 2 异常比例 2 3 异常数 1 概述 本章是接着上一章讲解 SpringCloud Spring cloud Alibaba Sentinel 服务降级 阿里版本Hystrix 2 服务
  • 寻找URL、域名、网站名对应区别和组合关系

    URL URL由三部分组成 资源类型 存放资源的主机域名 资源文件名 也可认为由4部分组成 协议 主机 端口 路径 例如 百度一下 你就知道 http 协议 www 服务器 baidu com 域名 表示根目录 也就是平常我们文件夹的D 是
  • 傅里叶变换回顾与总结

    傅里叶变换回顾与总结对傅里叶变换进行回顾总结 遗忘 要用的时候回顾此浓缩版即可 内容来源于不同出处 函数名称 符号使用不是十分统一 一维二维表达同时存在 略表歉意 1 两个前提线性性 两个信号加权和输出为它们分别输出和的加权 权值为标量 时
  • openwrt无线中继WIFI的设置--WR703N

    主要是配置两个文件 一 vi etc config wireless 在 option disabled 1 这一行下面加入OpenWRT连接WIFI的配置 内容如下 config wifi iface wlan0 option devic
  • QGIS之十四连接PostGIS数据库

    背景 有时候我们需要用到qgis来连接PostGIS数据库进行一些可视化或者空间分析的操作 那我们来了解QGIS如何连接PostGIS数据库 步骤 1 新建连接 在qgis的浏览器窗口中找到PostGIS 右键新建连接 2 输入数据库参数
  • 埋点的机制

    埋点事件 所谓埋点事件 就是埋点需要采集的活动 activity 埋点一般会获取三种事件 曝光事件 页面停留事件 点击事件 曝光事件 主要记录页面被用户浏览次数 上报机制 用户成功进入一个页面时记录一次曝光事件 刷新一次页面也会上报一次 如
  • 使用R语言进行回归诊断

    人们提出所谓回归诊断的问题 其主要内容有 关于误差项是否满足 独立性 等方差性 正态性 选择线性模型是否合适 是否存在异常样本 回归分析的结果是否对某些样本依赖过重 也就是回归模型是否具有稳定性 自变量之间是否存在高度相关 即是否存在多重共
  • MySQL数据库增删改查

    前言 MySQL准确来说是一款开源关系型数据库管理系统 支持多种数据库类型 包括整型 字符型 日期 时间型等 它还支持BLOB 二进制大对象 和文本类型 使得存储各种类型的数据变得更加便捷 平时工作中主要操作无非是增删改查 本文将通过Nav
  • c++学习之虚析构和纯虚析构

    1 多态使用时 如果子类中有属性开辟到堆区 那么父类指针在释放时无法调用子类的析构代码 解决方法 将父类中的析构函数改为虚析构或者是纯虚析构 2 虚析构和纯虚析构共性 1 都可以解决父类指针无法释放子类对象的问题 2 都需要有具体的函数实现
  • vue.js水平时间轴_用Vue.js制作的简单水平时间轴组件

    vue js水平时间轴 Vue水平时间线 Vue Horizontal Timeline a simple horizontal timeline component made with Vue js 一个由Vue js制作的简单水平时间轴
  • happens-before原则与内存屏障

    1 happens before原则定义 编译器和处理器会对我们程序优化而进行指令重排 但需要保证前一个操作结果对后一个依赖操作可见 其实只是在单线程下能保证 否则就禁止指令重排 1 1 指令重排带来的问题 虽然指令重排满足happens
  • Angular 1.0 入门指南

    Angular 1 0 入门指南 1 angular 1 0 特点 数据双向绑定MVVM 隔离作用域 2 Angular 的作用域 scope scope rootScope 先来看一下 angular 的一般使用格式 作用域定义 模块注入
  • 解析最全的 Aspose.Words功能介绍,看这篇就够了

    Aspose Words 为用户提供了广泛的功能 用户可以执行大量与文档相关的任务 从简单地将文档从一种受支持的格式转换为另一种格式并在转换过程中修改这些文档到业务任务 例如创建结构化和视觉上吸引人的文档或自动报告 现代文档格式和标准很复杂
  • nslookup DNS 域名解析 故障排除

    nslookup是一个可以监测DNS服务器是否正常运行 且是否能正确解析域名的工具 参考文章 http www t086 com article 5138 常用方法 nslookup 某一域名A 服务器 正在工作的DNS服务器主机名 Add
  • 如何使用Jar命令将指定文件夹打包成Jar包

    一 场景描述 通常我们在进行项目开发的时候都会使用很多第三方封装的依赖 那么有时候团队内部也会编写一些工具类需要打包成Jar包供其他团队或项目使用 本文主要介绍如果使用jar命令打包指定文件夹下的文件 生成非可执行Jar包 二 Jar命令
  • JavaWeb笔记——JDBC

    1 JDBC综述 在开发中我们使用的是java语言 那么势必要通过java语言操作数 据库中的数据 这就是接下来要学习的JDBC 一套标准接口 1 SQL语句是操作数据库的唯一手段 容易犯错误的几个认知 Navicat与MySQL的关系 前
  • 中移链(基于EOS)DDC-SDK实战-如何集成中移链DDC-SDK

    本文档是关于中移链 DDC SDK 实战 即如何集成基于 EOS 的中移链 DDC SDK 的操作指南 适用于 BSN 开放联盟链 中移链 DDC SDK 开发者 帮助读者了解如何以平台方的角色集成中移链 DDC SDK 前言 2021年1
  • 7--归并排序

    思想 将待排序序列分为两个子序列 再将两个子序列递归的继续分下去 直到序列有序 即序列中只有一个元素 再把所有有序子序列逐层合并为一个整体有序序列 每次合并是将两个有序表合并成一个有序表 图示 具体实现 把待排序序列分为两个子序列 然后让子