2-路归并排序的递归实现和非递归实现

简介: 2-路归并排序的递归实现和非递归实现

2-路归并排序当时考研时在严书上看到的是递归算法,实际上可能非递归算法效率更高,现在把两者都写出来:


#include <iostream>
#include<algorithm>
using namespace std;
const int maxn=101;
int t[maxn];
void merge(int a[],int l1,int r1,int l2,int r2) {
  //将相邻两区间合并,l2=r1+1
  int i=l1,j=l2,k=0;
  while(i<=r1&&j<=r2){
    if(a[i]<=a[j])
      t[k++]=a[i++];
    else
    t[k++]=a[j++];    
  }
  while(i<=r1)t[k++]=a[i++];
  while(j<=r2)t[k++]=a[j++];
  for(int m=l1,f=0;m<=r2;) 
  a[m++]=t[f++];
}
void mergesort(int a[],int left,int right) {          //递归实现 
  if(left<right){
    int mid=(left+right)/2;
    mergesort(a,left,mid);
    mergesort(a,mid+1,right);
    merge(a,left,mid,mid+1,right);  
  } 
}
void mergesortnot(int a[],int n) {                   //非递归实现 
  for(int step=2;step/2<n;step*=2) {
    for(int i=0;i<n;i+=step)
    {
      int mid=i+step/2-1;
      if(mid+1<n)
      merge(a,i,mid,mid+1,min(i+step-1,n-1));   
    }
  }
}
int main(){
    int a[6]={5,7,6,8,3,1};
  mergesort(a,0,5);
  for(int i=0;i<6;i++)
  cout<<a[i]<<" ";
  cout<<endl; 
   int b[6]={5,7,6,8,3,1};
  mergesortnot(b,6);
  for(int i=0;i<6;i++)
  cout<<b[i]<<" ";
  cout<<endl; 
  return 0; 
} 

上述原理都在归并,不过递归是自上而下思考,非递归实现是自下向上思考

相关文章
|
8月前
|
机器学习/深度学习 测试技术 计算机视觉
RT-DETR改进策略【Conv和Transformer】| ICCV-2023 iRMB 倒置残差移动块 轻量化的注意力模块
RT-DETR改进策略【Conv和Transformer】| ICCV-2023 iRMB 倒置残差移动块 轻量化的注意力模块
174 14
RT-DETR改进策略【Conv和Transformer】| ICCV-2023 iRMB 倒置残差移动块 轻量化的注意力模块
|
9月前
|
NoSQL 大数据 关系型数据库
AllData数据中台核心菜单十一:数据集成平台
杭州奥零数据科技有限公司成立于2023年,专注于数据中台业务,维护开源项目AllData并提供商业版解决方案。AllData提供数据集成、存储、开发、治理及BI展示等一站式服务,支持AI大模型应用,助力企业高效利用数据价值。
AllData数据中台核心菜单十一:数据集成平台
|
机器学习/深度学习 人工智能 算法
强化学习:从游戏到机器人的技术之旅
【6月更文挑战第14天】强化学习是智能体通过与环境互动学习决策策略的方法,已在游戏(如AlphaGo和OpenAI Five)和机器人技术中展现出巨大潜力。在机器人领域,它应用于控制、动作学习和交互沟通,帮助机器人适应复杂环境和任务。尽管面临挑战,但随着技术发展,强化学习有望在更多领域发挥关键作用。
|
Kubernetes 负载均衡 调度
【Docker 专栏】Docker Swarm 与 Kubernetes 的选型指南
【5月更文挑战第8天】Docker Swarm 和 Kubernetes 是两大容器编排工具,各有优势。Docker Swarm 简单易用,适合小到中型规模,与 Docker 生态系统集成紧密;而 Kubernetes 功能强大,扩展性好,适用于大规模、复杂场景。选择时需考虑团队技术能力、应用需求及现有技术栈。Kubernetes 学习曲线较陡,Docker Swarm 则较平缓。
804 7
【Docker 专栏】Docker Swarm 与 Kubernetes 的选型指南
|
数据采集 数据挖掘 数据处理
Python爬虫开发:爬取简单的网页数据
本文详细介绍了如何使用Python爬取简单的网页数据,以掘金为例,展示了从发送HTTP请求、解析HTML文档到提取和保存数据的完整过程。通过这个示例,你可以掌握基本的网页爬取技巧,为后续的数据分析打下基础。希望本文对你有所帮助。
|
关系型数据库 MySQL 数据库
MySQL 什么是意向锁?为什么要有意向锁?
【8月更文挑战第24天】MySQL 什么是意向锁?为什么要有意向锁?
1333 0
|
机器学习/深度学习 数据挖掘 C#
ONNX Runtime入门示例:在C#中使用ResNet50v2进行图像识别
ONNX Runtime入门示例:在C#中使用ResNet50v2进行图像识别
317 0
|
XML 设计模式 Java
springboot创建并配置环境3 - 配置扩展属性(下)
springboot创建并配置环境3 - 配置扩展属性(下)
springboot创建并配置环境3 - 配置扩展属性(下)
|
存储 NoSQL 大数据
新型数据库技术在大数据分析中的应用与优势探究
随着大数据时代的到来,传统数据库技术已经无法满足海量数据处理的需求。本文将探讨新型数据库技术在大数据分析中的应用情况及其所带来的优势,为读者解析数据库领域的最新发展趋势。
|
传感器 大数据 物联网
【Flink】Flink 应用场景解析
【1月更文挑战第26天】【Flink】Flink 应用场景解析