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

归并排序——

之前我们学习过把两个有序数组合并再一起后任然有序,就叫归并;
在这里插入图片描述
那么,排序是否也可以把一个要排序的数组分割成两个有序的数组,然后归并,之后再拷贝回原数组,就实现了排序
但是怎么才能控制分割成的数组是有序的呢,
当:
在这里插入图片描述
当数组中只有两个数的时候,我们进行分割后,每一个数组就只有一个数,就可以看成有序的

有了这个思想,那么我们就递归分个要排序的数组,当递归分割到只有两个数的时候,在归并
在这里插入图片描述

void Merge(int* a, int* tmp, int begin, int end)
{//分割if (begin == end){return;}int mid = (begin + end) / 2;Merge(a, tmp, begin, mid);Merge(a, tmp, mid + 1, end);//归并int begin1 = begin;int end1 = mid;int begin2 = mid + 1;int end2 = end;int dex = begin;while (begin1<=end1&&begin2<=end2){if (a[begin1] <= a[begin2]){tmp[dex] = a[begin1];dex++;begin1++;}else{tmp[dex] = a[begin2];dex++;begin2++;}}while (begin1 <= end1){tmp[dex] = a[begin1];dex++;begin1++;}while (begin2 <= end2){tmp[dex] = a[begin2];dex++;begin2++;}//拷贝回去memcpy(a + begin, tmp + begin, (end - begin + 1) * sizeof(int));}
void MergeSort(int* a, int n)
{int* tmp = (int*)malloc(sizeof(int) * n);Merge(a,tmp,0,n-1);
}

非递归的写法:
之前的快速排序是借助栈来实现非递归,因为每次分完之后他就找出了key的位置,那个区间出栈后不需要再用到
但是归并排序的话,分割完后,还要用到之前的分割区间,但是都已经出栈了,就找不到了。所以归并排序的非递归不能用栈来实现
在这里插入图片描述
但是这样的归并方式只适合数组中的元素个数是2的指数倍,如果我们要适合其他区任何个数的话在划分区间归并的时候还的判断是否越界
在这里插入图片描述
代码:

void MergeSortNoNs(int* a, int n)
{int* tmp = (int*)malloc(sizeof(int) * n);int pas = 1;while (pas<n){for (int i = 0; i < n; i += pas * 2){int begin1 = i; int end1 = i + pas - 1;int begin2 = i + pas; int end2 = i + 2 * pas - 1;//越界管理if (begin2 >= n){break;}if (end2 >= n){end2 = n - 1;}int dex = i;while (begin1 <= end1 && begin2 <= end2){if (a[begin1] <= a[begin2]){tmp[dex] = a[begin1];dex++;begin1++;}else{tmp[dex] = a[begin2];dex++;begin2++;}}while (begin1 <= end1){tmp[dex] = a[begin1];dex++;begin1++;}while (begin2 <= end2){tmp[dex] = a[begin2];dex++;begin2++;}//拷贝回去memcpy(a + i, tmp+i, (end2-i+1) * sizeof(int));}pas *= 2;}
}
http://www.lryc.cn/news/210336.html

相关文章:

  • 阿里云企业邮箱基于Spring Boot快速实现发送邮件功能
  • 大数据Doris(十三):创建用户和创建数据库并赋予权限
  • 【Unity小技巧】可靠的相机抖动及如何同时处理多个震动
  • Megatron-LM GPT 源码分析(四) Virtual Pipeline Parallel分析
  • IOC课程整理-8 Spring Bean作用域
  • 本地websocket服务端暴露至公网访问【内网穿透】
  • C/C++跨平台构建工具CMake-----灵活添加库并实现开发和生产环境的分离
  • javascript判断对象中是否存在某个字段
  • 网络基础-2
  • 【MySQL索引与优化篇】索引的分类与设计原则
  • 基于Java的民航售票管理系统设计与实现(源码+lw+部署文档+讲解等)
  • 应用案例|基于三维机器视觉的机器人引导电动汽车充电头自动插拔应用方案
  • 基于Java的流浪动物救助管理系统设计与实现(源码+lw+部署文档+讲解等)
  • 关于错误javax.net.ssl.SSLException: Received close_notify during handshake
  • JAVA实现校园失物招领管理系统 开源
  • 基于Java的体育竞赛成绩管理系统设计与实现(源码+lw+部署文档+讲解等)
  • 网络设备远程登录和管理-双厂商
  • 深度学习使用Keras进行多分类
  • Node模块化开发
  • 震惊!原来BUG是这么理解的!什么是BUG?软件错误(BUG)的概念
  • JEnv使用初体验
  • CCF CSP认证历年题目自练 Day39
  • 【用户登录】模块之登录认证+鉴权业务逻辑
  • 开启CETOS 裸奔了一年的服务器开启firewall防火墙
  • eslint识别不了别名解决方法
  • 【windows 脚本】netsh命令
  • 二叉树三种遍历的递归与非递归写法
  • 虹科 | 解决方案 | 汽车示波器 远程诊断方案
  • Unity ScrollView最底展示
  • linux常用基本命令大全的使用(三)