算法基础:归并排序(超详细)

归并排序

题目1:归并排序

给定你一个长度为 n 的整数数列。

请你使用归并排序对这个数列按照从小到大进行排序。

并将排好序的数列按顺序输出。

输入格式
输入共两行,第一行包含整数 n。

第二行包含 n 个整数(所有整数均在 1∼109 范围内),表示整个数列。

输出格式
输出共一行,包含 n 个整数,表示排好序的数列。

数据范围
1≤n≤100000
输入样例:
5
3 1 2 4 5
输出样例:
1 2 3 4 5

#include<iostream>
#include<cstring>
#include<algorithm>using namespace std;const int N = 100010;int q[N],tmp[N];int n;void merge_sort(int q[], int l, int r){if(l>=r) return;int mid = l+r >>1;merge_sort(q,l,mid)merge_sort(q,mid+1,r);//i和j相当于一个双指针,指向当前需要排序的数组的两个部分。int i=l,j=mid+1;int k=0;while(i<=mid && j<=r){if(q[i]<=q[j])  tmp[k++] = q[i++];else  tmp[k++] = q[j++];}while(i<=mid)  tmp[k++] = q[i++];while(j<=r)   tmp[k++] = q[j++];//注意这里的l和r是相对于原始的q数组的位置,而tmp保存的值只是当前指针指向的这两个部分的排好序的值。for(int i=l,j=0;i<=r;i++,j++) q[i]=tmp[j];
}int main(){int n;cin>>n;for(int i=0;i<n;i++) scanf("%d", &q[i]);merge_sort(q,0,n-1);for(int i=0; i<n;i++) printf("%d ",q[i]);return 0;}

算法思想: 归并排序也是基于分治的思想,但是与快速排序不同的是,归并排序是先分治,再排序(先递归,再比较)。而快速排序是先排序,再分治(先比较,再递归);从总体来说归并排序的计算是自底向上的,而快速排序的计算是自顶向下的。由于归并排序在排序的过程中对数组的划分是固定的(快速排序不是固定的,与选择的基准点有关),所以归并排序的复杂度是固定的。
复杂度分析:归并排序(Merge Sort)是一种典型的分治算法,其时间复杂度和空间复杂度如下:
时间复杂度:最好情况下,归并排序的时间复杂度为O(nlogn);最坏和平均情况下,归并排序的时间复杂度也为O(nlogn)。
空间复杂度:归并排序的空间复杂度为O(n),因为在合并过程中,需要额外的空间存储左右两个子序列的元素。
具体的分析过程如下:
1.归并排序首先将待排序序列均分为两个子序列,然后分别对这两个子序列进行排序,最后将排序好的子序列进行合并。这个过程可以递归进行,直到子序列的长度为1,此时可以认为子序列已经排好序。
2.在最好情况下,即待排序序列已经排好序时,每次递归的两个子序列都是有序的。这时,归并排序的时间复杂度为O(n)。因为无论序列长度为多少,都只需要进行一次合并操作。
3.在最坏和平均情况下,即待排序序列完全无序或部分有序时,每次递归的两个子序列都需要进行排序。这时,归并排序的时间复杂度为O(nlogn)。因为每次递归都需要将序列均分为两个子序列,然后对这两个子序列进行排序。这个过程可以看作是对元素数量的对数级别的递归调用。
在空间复杂度方面,由于归并排序需要额外的空间存储左右两个子序列的元素,因此空间复杂度为O(n)。

题目2:归并排序的应用-逆序对的数量

给定一个长度为 n 的整数数列,请你计算数列中的逆序对的数量。

逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i<j 且 a[i]>a[j],则其为一个逆序对;否则不是。

输入格式
第一行包含整数 n,表示数列的长度。

第二行包含 n 个整数,表示整个数列。

输出格式
输出一个整数,表示逆序对的个数。

数据范围
1≤n≤100000,
数列中的元素的取值范围 [1,109]。

输入样例:
6
2 3 4 5 6 1
输出样例:
5

//在分治后的每一层合并中顺便求出逆序对数量是这个题想法的由来,归并排序分治我们求的是从小到
//大的顺序,我们所求的逆序对恰好是逆序数量,与归并排序不谋而合。#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>using namespace std;const int N =100000;int q[N],f[N];long long  res=0;long long  merge_sort(int l,int r){if(l>=r) return 0;int mid=(l+r)>>1;res=merge_sort(l,mid)+merge_sort(mid+1,r);int k=0,i=l,j=mid+1;while(i<=mid&&j<=r){if(q[i]<=q[j]) f[k++]=q[i++];else{//当前i后面的数都比j大,而且每个数组段在排序的过程中都是排好序的(由更小的数组段合并来的),所以逆序数加上mid-i+1。res+=mid-i+1;f[k++]=q[j++];}}while(i<=mid) f[k++]=q[i++];while(j<=r) f[k++]=q[j++];for(int i=l,j=0;i<=r;i++,j++) q[i]=f[j];return res;
}int main(){int n;cin>>n;for(int i=0;i<n;i++) scanf("%d",&q[i]);merge_sort(0,n-1);printf("%lld",res);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/76491.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

时序预测 | MATLAB实现LSSVM最小二乘支持向量机时间序列预测未来

时序预测 | MATLAB实现LSSVM最小二乘支持向量机时间序列预测未来 目录 时序预测 | MATLAB实现LSSVM最小二乘支持向量机时间序列预测未来预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现LSSVM时间序列预测未来(最小二乘支持向量机)&#xff1b; 2.运行环境Mat…

Scala在大数据领域的崛起:当前趋势和未来前景

文章首发地址 Scala在大数据领域有着广阔的前景和现状。以下是一些关键点&#xff1a; Scala是一种具有强大静态类型系统的多范式编程语言&#xff0c;它结合了面向对象编程和函数式编程的特性。这使得Scala非常适合处理大数据&#xff0c;因为它能够处理并发、高吞吐量和复杂…

LabVIEW更改Tab所选标签的颜色

LabVIEW更改Tab所选标签的颜色 在开发过程中&#xff0c;有时会出现要将不同tab页设置不同颜色的情况。此VI允许编程方式更改前面板选项卡控件上选项卡的颜色。它是突出显示所选选项卡的理想选择 在某些应用程序中&#xff0c;用户希望在按下时突出显示选项卡控件。此VI使用事…

借助ChatGPT使用Pandas实现Excel数据汇总

一、问题的提出 现在有如下一个Excel表&#xff1a; 上述Excel表中8万多条数据&#xff0c;记录的都是三年以来花菜类的销量&#xff0c;现在要求按月汇总实现统计每个月花菜类的销量总和&#xff0c;如果使用Python的话要给出代码。 二、问题的解决 1.首先可以用透视表的方…

信息化发展36

IT审计底稿 1 、审计工作底稿是审计证据的载体&#xff0c; 是审计人员在审计过程中形成的审计工作记录和获取的资料。它形成于审计过程&#xff0c; 也反映整个审计过程。 2 、审计底稿的作用表现在&#xff1a; 是形成审计结论、发表审计意见的直接依据&#xff1b; 是评价考…

idea配置git(gitee)并提交(commit)推送(push)

Intellij Idea VCS | 版本控制 - 知乎 IDEA项目上传到gitee仓库_idea上传代码到gitee_robin19712的博客-CSDN博客 git程序下载国内镜像地址&#xff1a; https://registry.npmmirror.com/binary.html?pathgit-for-windows/v2.42.0.windows.2/ 解压后放到固定路径&#xff1a…

软件测开记录(一)

知识点汇总 14&#xff1a;00面试&#xff0c;14&#xff1a;06就出来了&#xff0c;问的问题有点变态。。。 python自动化测试学习路线&#xff08;从入门到精通&#xff09; 单元知识点 测试常用工具 python自动化测试学习路线&#xff08;从入门到精通&#xff09; 服务…

css溢出隐藏的五种方法

一、文本溢出 当容器中的文本内容超出容器的宽度或高度时&#xff0c;就会出现文本溢出的情况。下面介绍几种CSS实现文本溢出的方法。 单行文本溢出省略&#xff1a; 单行文本溢出省略通常用于标题等文本显示&#xff0c;可以通过设置white-space和text-overflow属性实现。w…

ADW300物联网电表支持MODBUSTCP协议、MQTT协议-安科瑞黄安南

摘要 随着通信技术的应用越来越广泛&#xff0c;具有通信功能的电子产品越来越多&#xff0c;同时也随着Wi-Fi无线覆盖网络区域的形成&#xff0c;如何利用无线网络覆盖广、带宽高、低使用费率的优势组建物联网系统&#xff0c;变成了一个很实际的问题。 安科瑞也紧跟趋势推出…

antv-G6知识图谱安装--使用(实例)--连接线修改成动态,并添加跟随线移动的光圈,设置分支跟踪定位功能

这系列文章主要是完成一个图谱的自定义修改&#xff08;最近太忙了长篇分段更新自己使用流程&#xff09; 1. 连接线修改成动态&#xff0c;并添加跟随线移动的光圈 2. 自定义卡片样式和文字内容 3. 自定义伸缩节点的样式&#xff0c;并添加动画样式 3. 自定义弹窗样式 4. 自定…

lvs负载均衡、LVS集群部署

四&#xff1a;LVS集群部署 lvs给nginx做负载均衡项目 218lvs&#xff08;DR 负载均衡器&#xff09; yum -y install ipvsadm&#xff08;安装这个工具来管理lvs&#xff09; 设置VIP192.168.142.120 创建ipvsadm的文件用来存放lvs的规则 定义策略 ipvsadm -C //清空现有…

消费者遭李佳琦“痛刺”,背后MCN机构拦不住祸从口出

撰稿|行星 来源|贝多财经 9月11日凌晨&#xff0c;头部主播李佳琦就“直播间怼网友”一事在微博发表公开道歉。 李佳琦在9月10日直播带货时&#xff0c;被网友质疑“花西子的眉笔越来越贵了”&#xff0c;当即表示“哪里贵了&#xff1f;这么多年都是这个价格&#xff0c;不…

自己设计CPU学习之路——基于《Xilinx FPGA应用开发》

1. 一个32组位宽为32的寄存器堆 框图 代码 regfile.h ifndef __FEGFILE_HEADER__define __REGFILE_HEADER__define HIGH 1b1define LOW 1b0define ENABLE_ 1b0define DISABLE_ 1b1define DATA_W 32define DataBus 31:0define DATA_D 32d…

C 语言中关键字const

const 是 C 语言中的一个关键字&#xff0c;它表示一个对象或变量是常量&#xff0c;即在其生命周期内不可更改。在 C 语言中&#xff0c;const 有多种用法&#xff0c;可以提高代码的可读性和安全性。这里列举了一些关于 const 的常见用法&#xff1a; 声明常量变量&#xff…

正中优配:月线macd指标参数设置?

随着投资者长期持有股票的越来越受欢迎&#xff0c;月线MACD目标已成为识别趋势和交易信号的重要东西。但是&#xff0c;许多投资者在设置MACD目标参数时仍然感到困惑。本文将从多个视点剖析&#xff0c;为您解答月线MACD目标参数设置的问题。 什么是MACD目标&#xff1f; MAC…

MATLAB解析和保存ini文件

1. 将ini文件转换成struct结构体 function data ini2struct(filename)fid fopen(filename, r);if fid -1error(Unable to open file %s., filename);enddata struct();section ;while ~feof(fid)line fgetl(fid);line strtrim(line);% 如果是注释行或者空行&#xff0c…

vue中v-for循环数组使用方法中splice删除数组元素(错误:每次都删掉点击的下面的一项)

总结&#xff1a;平常使用v-for的key都是使用index&#xff0c;这里vue官方文档也不推荐&#xff0c;这个时候就出问题了&#xff0c;我们需要key为唯一标识&#xff0c;这里我使用了时间戳&#xff08;new Date().getTime()&#xff09;处理比较复杂的情况&#xff0c; 本文章…

Spring-Cloud-Openfeign如何做熔断降级?

微服务系统中为了防止服务雪崩问题&#xff0c;服务之间相互调用的时候一般需要开启熔断与降级&#xff0c;下面就来看下feign如何集成hystrix来做熔断与降级。 依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-c…

Full authentication is required to access this resource解决办法

我们在使用postman调接口时候&#xff0c;有的时候需要权限才可以访问&#xff0c;否则可能会报下面这个错误 {"success": false,"message": "Full authentication is required to access this resource","code": 401,"result&q…

浏览器缓存机制及其分类

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 强缓存&#xff08;Cache-Control 和 Expires&#xff09;⭐ 协商缓存&#xff08;ETag 和 Last-Modified&#xff09;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几…