递归实现

merge函数利用的是双指针技巧降低复杂度。

mergeSort函数使用了递归,当中先对左右序列各调用一次mergeSort,再对整个序列调用merge。就按照最浅层的归并的思想去理解,不要大脑走到哪就step in。

另外mergeSort进入递归有个left<right的判定容易漏写。

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;const int maxn = 10;
const int INF = 1000000000;//INF:下确界
const LL SUP = (1LL<<63)-1;//SUP:上确界
const double eps = 1e-5;LL Map[128];void merge(int A[],int L1,int R1,int L2,int R2){int i=L1,j=L2;int temp[maxn];int index = 0;while(i<=R1&&j<=R2){//是≤不是< if(A[i]<=A[j]){temp[index++] = A[i++];}else{temp[index++] = A[j++];}}while(i<=R1)temp[index++] = A[i++];//这个while很容易写成if while(j<=R2)temp[index++] = A[j++];for(int i=0;i<index;i++){A[L1+i] = temp[i];}}void mergeSort(int A[],int l,int r){//递归实现的归并排序 if(l<r){int mid = (l+r)/2;mergeSort(A,l,mid);mergeSort(A,mid+1,r);merge(A,l,mid,mid+1,r); }} int main(){int A[maxn] = {66,12,33,57,64,27,39,66,78,66};mergeSort(A,0,maxn-1);for(int i=0;i<maxn;i++){printf("%d ",A[i]);}return 0;
}

非递归实现

基础的归并函数merge是一样的,但感觉非递归道理容易想明白但是实现起来细节多。注意两个for和一个if的<n不能写成<=n(如果传入的n是数组的长度而非最后一个元素的下标)

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;const int maxn = 10;
const int INF = 1000000000;//INF:下确界
const LL SUP = (1LL<<63)-1;//SUP:上确界
const double eps = 1e-5;LL Map[128];void merge(int A[],int L1,int R1,int L2,int R2){int i=L1,j=L2;int temp[maxn];int index = 0;while(i<=R1&&j<=R2){//是≤不是< if(A[i]<=A[j]){temp[index++] = A[i++];}else{temp[index++] = A[j++];}}while(i<=R1)temp[index++] = A[i++];//这个while很容易写成if while(j<=R2)temp[index++] = A[j++];for(int i=0;i<index;i++){A[L1+i] = temp[i];}}void mergeSort(int A[],int n){//非递归实现的归并排序 //step为组内元素个数(每归并一次乘二)for(int step=2;step/2<n;step*=2){//每step个元素一组,组内左一半step/2和右一半step/2的元素合并,注意有很多个这样的组for(int i=0;i<n;i+=step){int mid = i+step/2-1;//step/2为左子区间元素个数if(mid+1<n){//右子区间存在元素则合并 merge(A,i,mid,mid+1,min(i+step-1,n));}} } } int main(){int A[maxn] = {66,12,33,57,64,27,39,66,78,66};mergeSort(A,maxn);for(int i=0;i<maxn;i++){printf("%d ",A[i]);}return 0;
}

如果时间限制允许,且只要求打印出每一趟归并排序的结果,可以不调用merge()而是采用sort

void mergeSort(int A[],int len){for(int step = 2;step/2<len;step*=2){for(int i=0;i<len;i+=step){sort(A+i,A+min(i+step,len));}for(int i=0;i<maxn;i++){printf("%d ",A[i]);}printf("\n");}
}

但是这样就不是真正意义上的归并了

(C++)归并排序的递归与非递归实现相关推荐

  1. 快速排序和归并排序中一趟的理解(递归和非递归)

    引:2019年408中数据结构一道考察快速排序的选择题 答案:D 定位:这道题在考察快速排序中一趟的概念.注意,基本的冒泡,插入,选择排序的一趟概念很容易理解, 接下来我们要讨论的是递归排序算法中(本 ...

  2. 归并排序的python实现:递归与非递归

    递归 原理比较简单,就是有序数组的合并. def merge(a, b):c = []i = j = 0while i < len(a) and j < len(b):if a[i] &l ...

  3. python创建树结构、求深度_数据结构-树以及深度、广度优先遍历(递归和非递归,python实现)...

    前面我们介绍了队列.堆栈.链表,你亲自动手实践了吗?今天我们来到了树的部分,树在数据结构中是非常重要的一部分,树的应用有很多很多,树的种类也有很多很多,今天我们就先来创建一个普通的树.其他各种各样的树 ...

  4. 二叉树的几种递归和非递归式遍历:

    二叉树的几种递归和非递归式遍历: 1 #include <fstream> 2 #include <iostream> 3 4 using namespace std; 5 6 ...

  5. 全排列(含递归和非递归的解法)

    全排列在近几年各大网络公司的笔试中出现的比较频繁 首先来看看题目是如何要求的(百度迅雷校招笔试题). 用C++写一个函数, 如 Foo(const char *str), 打印出 str 的全排列, ...

  6. C#实现(递归和非递归)快速排序和简单排序

    C#实现(递归和非递归)快速排序和简单排序 本人因为最近工作用到了一些排序算法,就把几个简单的排序算法,想冒泡排序,选择排序,插入排序,奇偶排序和快速排序等整理了出来,代码用C#代码实现,并且通过了测 ...

  7. 分别用递归和非递归方式实现二叉树先序、中序和后序遍历(java实现)

    分别用递归和非递归方式实现二叉树先序.中序和后序遍历 用递归和非递归方式,分别按照二叉树先序.中序和后序打印所有的节点.我们约定:先序遍历顺序 为根.左.右;中序遍历顺序为左.根.右;后序遍历顺序为左 ...

  8. 汉诺塔的改编题(用栈求解,分别递归和非递归)

    限制不能从最左侧的塔直接移动到最右侧,也不能从最右侧直接移动到最左侧,而是必须经过中间,求当塔有N层的时候,打印最优移动过程和最优移动总步数 例如:当塔为两层时,最上层的塔记为1,最下层的塔记为2,则 ...

  9. 树的先序遍历,中序遍历,后续遍历(递归和非递归实现)

    前序遍历是先访问根节点再访问左子树最后访问右子树(中,左,右):中序遍历是先访问左子树再访问根节点最后访问右子树(左,中,右):后序遍历是先访问左子树再访问右子树最后访问根节点(左,右,中).---- ...

  10. 树与二叉树的深度优先与广度优先算法(递归与非递归)

    本博客前面文章已对树与二叉树有过简单的介绍,本文主要是重点介绍有关二叉树的一些具体操作与应用 阅读本文前,可以先参考本博客 各种基本算法实现小结(三)-- 树与二叉树   和  各种基本算法实现小结( ...

最新文章

  1. 《深入理解Java虚拟机》读书笔记五
  2. 提升UI技能的5个步骤
  3. 贪心——雪糕的最大数量(Leetcode 1833)
  4. CCF NOI1061 Wifi密码
  5. RightFont 5字体管理工具新手使用指南
  6. Linux命令 uname:查看系统与内核相关信息
  7. 项目测试日报模板整理
  8. Apifiny任命FBI前高管Timothy Murphy为董事会成员,帮助公司完成上市计划
  9. UNI-APP_uni-app uni.getUserProfile微信授权,微信授权信息显示微信用户解决
  10. 租房软件需要的是简单易用
  11. 喧喧发布 2.5.4 版本,新增客户端界面缩放等功能
  12. dede 留言簿 多个
  13. 如何一步步实现异步上传图片并预览图片(异步加载图片)
  14. 我是如何诱骗你的-高级钓鱼技术
  15. 颜色科学与计算机测配色 百度云,2004_01颜色科学与计算机测色配色实用技术_11196950.pdf...
  16. 【算法】查理复用算法(Charlieplexing)
  17. LTE学习-信道均衡(MMSE)
  18. stm32中空的I/O管脚是高电平还是低电平
  19. office 2013 下载地址
  20. Kubeadm部署Kubernetes1.18.6集群1

热门文章

  1. swif 在字符串中查找特定字符索引以及改变字符串的指定位置的颜色 字体大小
  2. webSocket详解
  3. [python][jupyter notebook]之菜鸟安装[pyecharts]中Geo或Map显示问题
  4. Linux下的redis的持久化,主从同步及哨兵
  5. flask的客户端服务端
  6. ELK 5.x日志分析 (二) Elasticserach 5.2 安装
  7. DoubleViewPager
  8. 漫漫运维路——集群基础知识
  9. 致被套基民:老基民的四点教训七点经验(ZT)
  10. ARM 寄存器 和 工作模式了解