当前位置: 首页 > 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.lryc.cn/news/607965.html

相关文章:

  • 【13】VisionMaster入门到精通——测量--线圆测量
  • Coze Studio 概览(六)--知识库管理
  • Flutter开发 初识目录结构
  • #Linux内存管理# 用一个案例详细介绍ARMv7-A架构 缺页中断处理的原理
  • C#多数据库批量执行脚本工具
  • 服装MES系统高效解决方案
  • Apache ShardingSphere 初识使用
  • 语音识别数据集
  • 力扣 二叉树遍历 中序/前序/后序(递归和迭代版)
  • Dify 从入门到精通(第 10/100 篇):使用 Dify 工具集扩展功能
  • 测试环境 PostgreSQL 库连接不上—案例分享
  • 设计Mock华为昇腾GPU的MindSpore和CANN的库的流程与实现
  • 音视频学习(四十六):声音的三要素
  • 【故障处理】redis会话连接满导致业务系统某个模块数据不显示
  • 【Flutter3.8x】flutter从入门到实战基础教程(八):公共state的集中管理机制
  • Kafka——关于Kafka动态配置
  • LeetCode 65:有效数字
  • OSPF综合实验(一)
  • 如何在 Ubuntu 24.04 或 22.04 LTS Linux 上安装 Guake 终端应用程序
  • 切换python多版本
  • Spring 中 Bean 的生命周期
  • 机器学习sklearn:聚类
  • 深入 Go 底层原理(四):GMP 模型深度解析
  • 深入 Go 底层原理(八):sync 包的实现剖析
  • 中科院自动化所机器人视觉中的多模态融合与视觉语言模型综述
  • Python 程序设计讲义(54):Python 的函数——函数概述
  • Java 集合框架: LinkedHashSet
  • innoDB的buffer pool
  • API征服者:Python抓取星链卫星实时轨迹
  • k8s集群部署(脚本版)