各类排序方法 归并排序 扩展练习 逆序对数量

七月挑战一个月重刷完Y总算法基础题,并且每道题写详细题解

进度:(3/106) 

归并排序的思想也是分而治之

归并优点:速度稳定,排序也稳定

排序也稳定(数组中有两个一样的值,排序之后他们的前后顺序不发生变化,我们就说这个排序是稳定的)

缺点:比起快排,空间复杂度更高

使用场景:数据量巨大,寻求稳定

速度:稳定n(logn)

思想思路

第一步

找分界点(mid,中间值)

第二步

先递归排序两边

第三步

将两个有序数组合二为一(归并)

有序数组合并实现思路(归并)

利用双指针

准备三个数组和两个指针

三个数组其中两个是有序数组,一个是准备用来存储的

#include<iostream>
#include<algorithm>
using namespace std;
int n,arr[10000010],sum[10000010];
void m_sort(int arr[],int l,int r){//到达边界,退出if(l>=r)return;//找到分界点int mid=(l+r)>>1;//利用分界点分成两个数组,递归两个数组m_sort(arr,l,mid),m_sort(arr,mid+1,r);//上面递归结束的,一定是两段有序数组//遍历两个数组,把两个数组的值,按照归并顺序放到第三暂存个数组//这个两个数组,其实指的是一个数组上的两个有序区间//每次放入之前,先进行比较两个数组里的指针指向的数//谁指向的数组元素小,先放谁进入第三个暂存数组//然后那个数组的指针指向下个元素,循环往复,直至其中一个数组遍历完毕int i=l,j=mid+1,k=0;while(i<=mid&&j<=r){if(arr[i]<arr[j])sum[k++]=arr[i++];else sum[k++]=arr[j++];}//上面的循环只保证其中一个数组遍历完毕//下面的两个循环,把未遍历完毕的那个数组剩下的元素,添加进暂存数组while(i<=mid)sum[k++]=arr[i++];while(j<=r)sum[k++]=arr[j++];//把暂存数组,放入原数组,替代原数组元素,完成对arr[l-r]的排序for(int i=l,j=0;i<=r&&j<=k; i++,j++){arr[i]=sum[j]; }
}
int main(){cin>>n;for(int i=0;i<n;i++)cin>>arr[i];m_sort(arr,0,n-1);for(int i=0;i<n;i++)cout<<arr[i]<<' ';return 0;
}

归并排序已完成

感悟思想:归并排序思想也是分而治之,但是和快排不同的是,快排是把大的放左边,小的放右边后

越递归,数组有序性越强,先分好再递归,归并排序是先递归,再排序

先确定下标的中间,中位点的下标,也就是数组长度是十的话,中位点的下标就是5

然后直接就分别递归中位点的左边和右边

直到数组变成一位的时候,递归停止,开始回溯

回溯到数组是两位的时候,现在的中位点左右两边,都是有序数组,只需要用两个指针,各指向两个数组

把小的,先放入新数组即可,后面同理,回溯时,中位点两边的数组一定都是有序数组

把两个有序数组合并成新数组,只需要使用双指针,把指向的数组的值较小的那个放入新数组,然后右移指针即可

直到回溯完毕,最后一次合并,原来的无序数组就排好了

有人叫回溯是回归,回归+合并,归并排序。

经典题:逆序对的数量

题目

活动 - AcWing

思路

用分治的思想,mid将数组分成=两段

则逆序对只有三种可能:

红色,同时在左半边,绿色,同时在右半边,黄色,一半在左一半在右

我们先解决黄色情况

假设数组a[n],数组b[n]都是两个有序数组,且a[n]就是mid前0到mid的子串,b[n]是mid后mid+1到r的子串

使用双指针算法,i,j分别指向数组第一个元素

a[i]和b[j]逐位比较

一旦b[j]小于a[i]中一个数,那说明,i到mid所有数,都和b[j]组成逆序对

因为a[]数组有序,a[i]到a[mid]的数必大于a[i],也就必大于b[j],也就必和b[j]组成逆序对

那我们只需要在两者归并排序时,累加记录res+=mid-i+1;

res便是这两个有序数组里的逆序对个数

(mid就是a[n]的长度,-i是减去已经指向过的数,+1是因为i从0开始)

黄色情况可以解决了,那只需要把所有情况都递归分割成黄色情况,所有情况都解决了

结论,只需要在归并排序时,累加记录arr[j]放在arr[i]前的情况时mid-(i+1)的值

代码

这里只对改动部分注释,看归并排序点这归并排序

#include<iostream>
using namespace std;
//数可能很大,使用long long
typedef long long ll;
int a[100010],s[100010];
ll add(int a[],int l,int r){if(l>=r)return 0;int mid=l+r>>1;//res接收值ll res=add(a,l,mid);//第二段的加上第一段的res+=add(a,mid+1,r);int k=0,i=l,j=mid+1;while(i<=mid&&j<=r){if(a[i]<=a[j])s[k++]=a[i++];else{//一旦a[j]需要放在a[i]前面//说明a[j]和a[i]以及a[i]到a[mid]所有数,都组成逆序对//mid-(i+1)的结果,就是a[i]到a[mid]的数的个数(+1是因为i从0开始)//每次出现这个时,把这个结果累加即可res+=mid-i+1;s[k++]=a[j++];}}while(i<=mid)s[k++]=a[i++];while(j<=r)s[k++]=a[j++];for(int i=0,j=l;j<=r;j++,i++){a[j]=s[i];}//处理完这段l-r,把res结果返回出去,处理下一段l-rreturn res;
}
int main(){int n;cin>>n;for(int i=0;i<n;i++){cin>>a[i];}ll res=add(a,0,n-1);cout<<res<<endl;return 0;
}

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

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

相关文章

专题六:Spring源码之初始化容器BeanFactory

上一篇咱们通过一个例子介绍初始化容器上下文相关内容&#xff0c;并通过两个示例代码看到了Spring在设计阶段为我预留的扩展点&#xff0c;和我们应该如何利用这两个扩展点在Spring初始化容器上下文阶段为我们提供服务。这一篇咱们接着往下看。 老这样子下回到refresh方法上来…

第55期:MySQL 频繁 Crash 怎么办?

社区王牌专栏《一问一实验&#xff1a;AI 版》全新改版归来&#xff0c;得到了新老读者们的关注。其中不乏对 ChatDBA 感兴趣的读者前来咨询&#xff0c;表达了想试用体验 ChatDBA 的意愿&#xff0c;对此我们表示感谢 &#x1f91f;。 目前&#xff0c;ChatDBA 还在最后的准备…

MSVCR120.DLL丢失的多种修复方法,助你快速解决dll问题

在日常生活和工作中&#xff0c;电脑已经成为我们不可或缺的工具。然而&#xff0c;在使用电脑的过程中&#xff0c;我们常常会遇到一些问题&#xff0c;其中之一就是电脑运行软件时提示找不到msvcr120.dll。如果该文件缺失或损坏&#xff0c;可能会导致依赖它的应用程序无法启…

高优先线程

你开发的时候有么有遇到过一个问题&#xff1a;服务器的一个服务线程过几个小时断连一次&#xff0c;断连之后会马上重连这种情况。这是由于CPU负载较高,线程调度时将处理数据的线程挂起了一段时间导致的。 因此&#xff0c;我有考虑到把cpu的核心进行分散开来&#xff0c;就类…

CesiumJS【Basic】- #042 绘制纹理线(Primitive方式)

文章目录 绘制纹理线(Primitive方式)1 目标2 代码2.1 main.ts3 资源文件绘制纹理线(Primitive方式) 1 目标 使用Primitive方式绘制纹理线 2 代码 2.1 main.ts var start = Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883);var

【剑指Offer系列】68-二叉树的最近公共祖先(哈希)

思路&#xff1a;使用map存储每个节点的父节点&#xff0c;则两个节点的最近公共祖先&#xff0c;即二者的最近父节点 1、中序遍历二叉树&#xff08;当前节点的下一个节点&#xff09; 2、记录每个节点的父节点 3、列出p的族谱、q的族谱 4、寻找二者最近的祖先 class Soluti…

微信小程序毕业设计-英语互助系统项目开发实战(附源码+论文)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;微信小程序毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计…

PS系统教程31

调色之色阶 调色与通道最基本的关系通道是记录颜色最基本的信息有些图片可以用通道去改变颜色信息的说明这些图像是比较高级的PS是一款图像合成软件&#xff0c;在合成过程中需要处理大量素材&#xff0c;比如要用这些素材进行抠背景&#xff0c;就要用到图层蒙版以及Alpha通道…

【详解】RV1106移植opencv-mobile库

文章目录 前言一、烧入镜像二、编译项目1.创建项目文件 三、移植四、运行文件五、总结 前言 硬件&#xff1a;瑞芯微Rv1106【Luckfox Pro\Max Pico、网线一根、USB线、串口助手、摄像头 软件&#xff1a;ubuntu 20.4 编译器&#xff1a;arm-rockchip830-linux-uclibcgnueabihf…

人工智能——常用数学基础之线代中的矩阵

1. 矩阵的本质&#xff1a; 矩阵本质上是一种数学结构&#xff0c;它由按照特定规则排列的数字组成&#xff0c;通常被表示为一个二维数组。矩阵可以用于描述一组数据&#xff0c;或者表示某种关系&#xff0c;比如线性变换。 在人工智能中&#xff0c;矩阵常被用来表示数据集…

【单片机与嵌入式】stm32串口通信入门

一、串口通信/协议 &#xff08;一&#xff09;串口通信简介 串口通信是一种通过串行传输方式在电子设备之间进行数据交换的通信方式。它通常涉及两条线&#xff08;一条用于发送数据&#xff0c;一条用于接收数据&#xff09;&#xff0c;适用于各种设备&#xff0c;从微控制…

入选顶会ICML,清华AIR等联合发布蛋白质语言模型ESM-AA,超越传统SOTA

作为细胞内无数生化反应的驱动力&#xff0c;蛋白质在细胞微观世界中扮演着建筑师和工程师的角色&#xff0c;不仅催化着生命活动&#xff0c;更是构筑、维系生物体形态与功能的基础构件。正是蛋白质之间的互动、协同作用&#xff0c;支撑起了生命的宏伟蓝图。 然而&#xff0…

Ubuntu DNS服务配置 深度解析

测试方法 resolvectl status dig alidns.com 修改实践 直接用接口配置&#xff0c;没用 /etc/resolv.conf&#xff0c;有效 /etc/netplan/01-network-manager-all.yaml,无效 /etc/systemd/resolved.conf&#xff0c;见link&#xff0c;为全局配置 [Resolve] DNS1.1.1.1 Fa…

Adobe Premiere 视频编辑软件下载安装,pr全系列分享 轻松编辑视频

Adobe Premiere&#xff0c;自其诞生之日起&#xff0c;便以其卓越的性能和出色的表现&#xff0c;稳坐视频编辑领域的王者宝座&#xff0c;赢得了无数专业编辑人员与广大爱好者的青睐。这款强大的视频编辑软件&#xff0c;凭借其丰富的功能和灵活的操作性&#xff0c;为用户提…

2024年道路运输安全员(企业管理人员)备考题库资料。

46.危险货物道路运输随车携带的单据&#xff0c;下列选项不属于的是&#xff08;&#xff09;。 A.道路运输危险货物安全卡 B.运单或者电子运单 C.道路危险货物运输从业资格证 D.车辆检测报告 答案&#xff1a;D 47.危险货物运输驾驶人员在24小时内实际驾驶车辆时间累计不…

ROS2在rviz2中实时显示轨迹和点

本文是将《ROS在rviz中实时显示轨迹和点》博客中rviz轨迹显示转为ROS2环境中的rviz2显示。 ros2的工作空间创建这里就不展示了。 包的创建 ros2 pkg create --build-type ament_cmake showpath --dependencies rclcpp nav_msgs geometry_msgs tf2_geometry_msgsshowpath.cpp…

【漏洞复现】和丰多媒体信息发布系统 QH.aspx 任意文件上传漏洞

0x01 产品简介 和丰多媒体信息发布系统也称数字标牌&#xff08;Digital Signage&#xff09;&#xff0c;是指通过大屏幕终端显示设备&#xff0c;发布商业、财经和娱乐信息的多媒体专业视听系统&#xff0c;常被称为除纸张媒体、电台、电视、互联网之外的“第五媒体”。该系…

1-4.时间序列数据建模流程范例

文章最前&#xff1a; 我是Octopus&#xff0c;这个名字来源于我的中文名–章鱼&#xff1b;我热爱编程、热爱算法、热爱开源。所有源码在我的个人github &#xff1b;这博客是记录我学习的点点滴滴&#xff0c;如果您对 Python、Java、AI、算法有兴趣&#xff0c;可以关注我的…

信息学奥赛初赛天天练-41-CSP-J2021基础题-n个数取最大、树的边数、递归、递推、深度优先搜索应用

PDF文档公众号回复关键字:20240701 2021 CSP-J 选择题 单项选择题&#xff08;共15题&#xff0c;每题2分&#xff0c;共计30分&#xff1a;每题有且仅有一个正确选项&#xff09; 4.以比较作为基本运算&#xff0c;在N个数中找出最大数&#xff0c;最坏情况下所需要的最少比…

我在中东做MCN,月赚10万美金

图片&#xff5c;Photo by Ben Koorengevel on Unsplash ©自象限原创 作者丨程心 在迪拜购物中心和世界最高建筑哈利法塔旁的主街上&#xff0c;徐晋已经“蹲”了三个小时&#xff0c;每当遇到穿着时髦的年轻男女&#xff0c;他都会上前询问&#xff0c;有没有意愿成为…