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

归并排序(简单讲解)

排序有许多种方法,其中最为简单的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.xdnf.cn/news/16833.html

相关文章:

  • MySQL 基础
  • linux source命令使用详细介绍
  • 浅拷贝与深拷贝的区别
  • Vue 响应式基础全解析2
  • Python Pandas.unique函数解析与实战教程
  • 24黑马SpringCloud的Docker本地目录挂载出现相关问题解决
  • 《JMM 与 happens-before 原则:并发编程的核心内存语义》
  • 网络常识-子网掩码
  • 暑期算法训练.13
  • stm32F407 实现有感BLDC 六步换相 cubemx配置及源代码(二)
  • 电脑系统中的BCD
  • 排序算法-堆排序
  • ARMv8/v9架构FAR_EL3寄存器介绍
  • Android 13/14/15 默认授权应用权限的实现方法
  • 《深潜React列表渲染:调和算法与虚拟DOM Diff的优化深解》
  • 开疆智能Profinet转Modbus网关连接信捷PLC从站配置案例
  • WPFC#超市管理系统(4)入库管理
  • oect刷入arm系统安装docker
  • 【Redis数据结构详解】特点、用途与实际应用
  • CCF IVC 2025“汽车安全攻防赛” -- Crypto -- WriteUp
  • VAST视频广告技术实现:从零开始搭建视频广告投放系统
  • 文件同步神器-rsync命令讲解
  • linux编译基础知识-库文件标准路径
  • Oracle 11g RAC集群部署手册(一)
  • imx6ull-驱动开发篇6——Linux 设备树语法
  • K8S部署ELK(二):部署Kafka消息队列
  • NVIDIA GPU架构
  • 四、Portainer图形化管理实战与Docker镜像原理
  • express-jwt报错:Error: algorithms should be set
  • Ubuntu系统VScode实现opencv(c++)视频及摄像头使用