如果说递归是自上到下解决问题,那么非递归就是自下而上解决问题

归并的非递归思想是:

将原数组首先进行两个元素为一组进行排序,然后合并为四个一组进行排序,八个一组进行排序,直至合并整个数组;

如下图:

我们合并的序列分为左子序列与右子序列,假设每个序列的长度为s=2, i 的初始值为0,则如下图

//一次归并过程private static void mergepass(int[] a, int[] b, int s) {// TODO Auto-generated method stubint i = 0;// 如果数组的长度为偶数,将相邻的两个数值恰好能两两比较while (i <= a.length - 2 * s) {// 右子序列的右边界i+2s-1<=a.length-1即i<=a.length-2smergeSort(a, b, i, i + s - 1, i + 2 * s - 1);i = i + 2 * s;}//不为偶数时if (i < a.length - s) {// 左子序列的右边界i+k-1<n,这个判断条件就保证了肯定存在右子序列,且剩余元素仍可分为两个子数组段,只不过第二个数组段不满。mergeSort(a, b, i, i + s - 1, a.length - 1);} else {// 剩余数组不满一个数组,直接合并到b里for (int j = i; j < a.length; j++) {b[i] = a[i];}}}

全部代码为:

 public static void main(String[] args) {int a[] = new int[] { 49, 38, 65, 97, 76, 13, 27 };merge(a);System.out.println("排列好的数组:");for (int c : a) {System.out.print(c + " ");}}private static void merge(int[] a) {// TODO Auto-generated method stubint[] b = new int[a.length];int s = 1;while (s < a.length) {mergepass(a, b, s);// 先将排列好的数组赋值给中间数组bmergepass(b, a, s);// 再将b的值赋给as += s;// 每次翻倍,1/2/4/8...}}private static void mergepass(int[] a, int[] b, int s) {// TODO Auto-generated method stubint i = 0;// 如果数组的长度为偶数,将相邻的两个数值恰好能两两比较while (i <= a.length - 2 * s) {// 右子序列的右边界i+2s-1<=a.length-1即i<=a.length-2smergeSort(a, b, i, i + s - 1, i + 2 * s - 1);i = i + 2 * s;}//不为偶数时if (i < a.length - s) {// 左子序列的右边界i+k-1<n,这个判断条件就保证了肯定存在右子序列,且剩余元素仍可分为两个子数组段,只不过第二个数组段不满。mergeSort(a, b, i, i + s - 1, a.length - 1);} else {// 剩余数组不满一个数组,直接合并到b里for (int j = i; j < a.length; j++) {b[i] = a[i];}}}//归并排序private static void mergeSort(int[] a, int[] b, int left, int mid, int right) {int p1 = left, p2 = mid + 1, k = left;// p1,p2是检测指针,k是存放指针while(p1<=mid&&p2<=right){if (a[p1] < a[p2]) {b[k++] = a[p1++];} else {b[k++] = a[p2++];}}while(p1<=mid){// 如果第一个序列未检测完,直接将后面所有元素加到合并的序列中b[k++] = a[p1++];}while (p2 <= right) {// 如果第二个序列未检测完,直接将后面所有元素加到合并的序列中b[k++] = a[p2++];}for (int i = left; i <= right; i++) {a[i] = b[i];}

非递归的归并排序(详细解析)相关推荐

  1. 计算机算法设计与分析 递归实现归并排序和非递归实现归并排序

    递归实现归并排序 输入排序的数组的长度,程序用随机数生成对应的数组,之后递归调用排序,排序过程中思想类似于二分,当每个最小分组中只有一个元素时开始返回,直到排完整个数组. #include<bi ...

  2. 二叉树前序、中序、后序遍历非递归写法的透彻解析

    前言 在前两篇文章二叉树和二叉搜索树中已经涉及到了二叉树的三种遍历.递归写法,只要理解思想,几行代码.可是非递归写法却很不容易.这里特地总结下,透彻解析它们的非递归写法.其中,中序遍历的非递归写法最简 ...

  3. java 归并排序 非递归_归并排序-递归及非递归的JAVA实现

    归并排序介绍 平均时间复杂度: O(NLogN) 最好情况时间复杂度: O(NLogN) 最差情况时间复杂度: O(NLogN) 所需要额外空间: 递归:O(N + LogN), 非递归:O(N) 稳 ...

  4. 排序下---(冒泡排序,快速排序,快速排序优化,快速排序非递归,归并排序,计数排序)

    排序上 排序上 交换类排序 基本思想:所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动. ...

  5. C语言实现 二叉树 的非递归遍历(详细图解)(基于栈的顺序存储)

    分析主要分析二叉树的非递归遍历,基于栈顺序存储二叉树的节点. 1 实现思路(具体的分析过程会在以下函数实现部分分析,中序遍历如下) 将树的所有节点标志位置为假(0),并将根节点压入栈中 进入循环,只要 ...

  6. 归并排序详解(递归+非递归)

    目录 归并排序 归并排序的思想 递归实现 非递归实现 归并排序 归并排序和之前讲的快速排序.希尔排序.堆排序一样,时间复杂度是O(N*logN). 它相对难理解一点,接下来我就从递归以及非递归两个方面 ...

  7. 作为程序员,你一定要知道的十大经典排序算法!(详细解析)

    十大排序算法可以说是每个程序员都必须得掌握的了,花了一天的时间把代码实现且整理了一下,为了方便大家学习,我把它整理成一篇文章,每种算法会有简单的算法思想描述,为了方便大家理解,我还找来了动图演示:这还 ...

  8. 递归改写成非递归的两种套路 Python实现

    树的遍历 所有遍历方式,这一篇就够了 生成随机二叉树并彩色打印 喜欢的话,记得点赞和收藏哟! 1 模拟系统调用栈 编译器使用堆栈传递函数参数.保存返回地址等.这里我们把子问题的参数都压入栈中,通过顺序 ...

  9. 【排序】详细聊聊归并排序(含非递归)

    目录 归并排序的基本思想: 递归算法: 递归算法的思路分析: 开辟数组的函数: 递归的函数: 非递归算法: 非递归的思路分析: 边界问题: 时间复杂度和空间复杂度分析: 归并排序的基本思想: 归并排序 ...

最新文章

  1. PHP 利用AJAX获取网页并输出(原创自Zjmainstay)
  2. spring19:AspectJ的初步介绍
  3. C语言训练题-有重复的数据
  4. STM32F103五分钟入门系列(十三)独立看门狗IWDG
  5. 转 c#读写xml文件
  6. 已经是最大股东却还要全资收购!腾讯看上了搜狗的啥?
  7. censtos6.5安装java 8_Centos6.5 安装JDK
  8. ETHREAD APC 《寒江独钓》内核学习笔记(4)
  9. C++ 以智能指针管理内存资源
  10. 参观云栖小镇体会_云栖小镇感受
  11. Linux上创建SSH隧道
  12. keepalived+redis的高可用部署步骤
  13. string.Empty与,null的区别
  14. 搭建服务器处理系统(基于netty),基于Netty的农业物联网服务器系统设计.PDF
  15. Scrapy爬虫入门教程十 Feed exports(导出文件)
  16. 《惢客创业日记》2018.10.29(周一) 中国只有一个雷军,却有千万个中小企业
  17. FFmpeg 集成 x265 编译及解码
  18. 开放英语计算机考试,(荐)最新电大《英语I(1)》(开放英语1)完成句子、翻译题归纳汇总复习小抄.doc...
  19. 中学教学参考杂志中学教学参考编辑部中学教学参考杂志社2022年第18期目录
  20. 重磅开讲 | 图灵奖得主—— Joseph Sifakis

热门文章

  1. 本周ACM总结以及最近ACM心得小结
  2. 没有一个真正歌手的时代,没有一首好歌的年代
  3. 通过putty取linux文件,putty对Linux上传下载文件或文件夹
  4. 老闪创业那些事儿(4)——A轮融资的选择
  5. Android7.0 BatteryStatsService
  6. 入门必看!ui设计分类有哪些?【萧蕊冰】
  7. 完美字符子串 单调队列预处理+DP线段树优化
  8. 计算机编程玫瑰花,c语言实现玫瑰花的方法
  9. 【兴趣阅读】DeepInf: Social Influence Prediction with Deep Learning
  10. 笔记:Bootstrap导航与router-link 不和谐