当前位置: 首页 > news >正文

归并排序(简单讲解)

排序有许多种方法,其中最为简单的sort排序与冒泡排序,但是在一些需要排序的题目中这两个方法就不好用了。

例如洛谷P1908需要用到归并排序,今天我们来简单讲解一下这个排序方法。

首先我们需要明白,归并排序其实和二分有些相似的地方,具体如图

需要依次将一个数组分成单个后,比较大小,再次合并成为一个新的且排好顺序的数组

那么我们要攻克的难点为

1 将数组依次分开

2 排序

3 合并

分开时要用到二分的思想,当左端点小于右端点时进行分割,直到将整个数组分成单个数字存在,随后进行排序与合并

if(left<right){int mid=(left+right)>>1;mmsort(arr,add,left,mid);mmsort(arr,add,mid+1,right);gb(arr,add,left,mid,right);}

这里我将排序与合并写在了一起,先存入左端点与右端点,方便后续将数据存入新数组,随后在循环中将此时要判断数据放入新数组中,最后将还没有存完的数组一起放在新数组的尾端,最后将新数组中的数据覆盖原数组

int l=left,r=mid+1;int pp=left;while(l<=mid&&r<=right){if(arr[l]<arr[r]){add[pp++]=arr[l++];}else{add[pp++]=arr[r++];}}while(l<=mid){add[pp++]=arr[l++];}while(r<=right){add[pp++]=arr[r++];}while(left<=right){arr[left]=add[left];left++;}

完整代码如下:

#include<bits/stdc++.h>
using namespace std;
int n;
int arr[200000];
void gb(int arr[],int add[],int left,int mid,int right)
{int l=left,r=mid+1;int pp=left;while(l<=mid&&r<=right){if(arr[l]<arr[r]){add[pp++]=arr[l++];}else{add[pp++]=arr[r++];}}while(l<=mid){add[pp++]=arr[l++];}while(r<=right){add[pp++]=arr[r++];}while(left<=right){arr[left]=add[left];left++;}
}
void mmsort(int arr[],int add[],int left,int right)
{if(left<right){int mid=(left+right)>>1;mmsort(arr,add,left,mid);mmsort(arr,add,mid+1,right);gb(arr,add,left,mid,right);}
}
void msort(int arr[],int n)
{int add[n+10];mmsort(arr,add,0,n-1);
}
int main()
{cin>>n;for(int i=0;i<n;i++){cin>>arr[i];}msort(arr,n);for(int i=0;i<n;i++){cout<<arr[i]<<" ";}return 0;} 

http://www.dtcms.com/a/311475.html

相关文章:

  • [论文阅读] 人工智能 + 软件工程 | GitHub Marketplace中CI Actions的功能冗余与演化规律研究
  • 【RK3568 看门狗驱动开发详解】
  • Kubernetes Gateway API 详解:现代流量路由管理方案
  • 【最后203篇系列】030 强化学习探索
  • 浏览器及java读取ros1的topic
  • 重生之我在暑假学习微服务第八天《OpenFeign篇》
  • 暑期算法训练.13
  • cv弹窗,退款确认弹窗
  • 数据结构(12)二叉树
  • 深入 Go 底层原理(六):垃圾回收(GC)
  • 数据资产是什么?
  • MySQL 内置函数
  • npm安装下载慢问题
  • 离线安装docker和docker-compose
  • 【人工智能agent】--服务器部署PaddleX 的 印章文本识别模型
  • JVM 调优中JVM的参数如何起到调优动作?具体案例,G1GC垃圾收集器参数调整建议
  • Junit5+Maven+RestAssured+Allure接口自动化框架
  • VScode对Ubuntu用root账号进行SSH远程连接开发
  • MSQL-聚簇索引与非聚簇索引的比较
  • k8s的pod的YAML问题
  • 公共卫生场景下漏检率↓76%:陌讯动态特征融合算法在口罩识别中的实战解析
  • 7月销售超5万辆,零跑汽车再创单月历史新高
  • 开源列式分布式数据库clickhouse
  • SpringBoot 启动富文本文字更改
  • .NET 中,Process.Responding 属性用于检查进程的用户界面是否正在响应
  • Linux性能监控与调优全攻略
  • SpringCloud微服务
  • 1分钟临时共享空间在线小工具实现
  • 存储成本深度优化:冷热分层与生命周期管理——从视频平台年省200万实践解析智能存储架构
  • Qt 实战教程:使用 QNetworkAccessManager 发送 HTTP POST