归并排序可以采用递归方法(见:归并排序),但递归方法会消耗深度位O(longn)的栈空间,使用归并排序时,应该尽量使用非递归方法。本文实现了java版的非递归归并排序。

更多:数据结构与算法合集

思路分析

  递归排序的核心是merge(int[] arr, int start, int mid, int end)函数,讲[start~mid-1]和[mid~end]部分的数据合并,递归代码是使用递归得到mid,一步步分解数组。

  非递归时,我们直接定义要合并的小数组长度从1开始,在较小的长度数组都合并完成后,令长度*2,继续进行合并,直到合并完成。

完整Java代码

(含测试代码)

public class MergeSort2 {public void mergeSort(int[] arr) {if(arr==null || arr.length<=0)return;int width = 1;while(width<arr.length) {mergePass(arr,width);width*=2; }}private void mergePass(int[] arr,int width) {int start=0;while(start+2*width-1<arr.length) {int mid=start+width-1;int end=start+2*width-1;merge(arr,start,mid,end);start=start+2*width;}//剩余无法构成完整的两组也要进行处理if(start+width-1<arr.length) merge(arr, start, start+width-1, arr.length-1);}private void merge(int[] arr, int start, int mid, int end) {int i=start;int j=mid+1;int[] temp = new int[end-start+1];int index=0;while(i<=mid && j<=end) {if(arr[i]<=arr[j])temp[index++]=arr[i++];elsetemp[index++]=arr[j++];}while(i<=mid)temp[index++]=arr[i++];while(j<=end)temp[index++]=arr[j++];for(int k=start;k<=end;k++)arr[k]=temp[k-start];}//==========测试代码=================public void test1() {int[] a = null;mergeSort(a);System.out.println(Arrays.toString(a));}public void test2() {int[] a = {};mergeSort(a);System.out.println(Arrays.toString(a));}public void test3() {int[] a = { 1 };mergeSort(a);System.out.println(Arrays.toString(a));}public void test4() {int[] a = { 3, 3, 3, 3, 3 };mergeSort(a);System.out.println(Arrays.toString(a));}public void test5() {int[] a = { -3, 6, 3, 1, 3, 7, 5, 6, 2 };mergeSort(a);System.out.println(Arrays.toString(a));}public static void main(String[] args) {MergeSort2 demo =new MergeSort2();demo.test1();demo.test2();demo.test3();demo.test4();demo.test5();}
}

  

MergeSort2

更多:数据结构与算法合集

转载于:https://www.cnblogs.com/yongh/p/9965913.html

【Java】 归并排序的非递归实现相关推荐

  1. 排序算法杂谈(三) —— 归并排序的非递归实现

    1. 递归 在众多排序算法中,归并排序(Merge Sort)和快速排序(Quick Sort)都是时间复杂度为 O(nlog2n) 的高效排序. 这两种排序有一种共性,就是运用到了递归的思想. 在程 ...

  2. 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,循环控制及其优化

    研究了递归方法实现回溯,解决N皇后问题,下面我们来探讨一下非递归方案 实验结果令人还是有些失望,原来非递归方案的性能并不比递归方案性能高 代码如下: package com.newflypig.eig ...

  3. 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,数据结构“栈”实现

    是使用递归方法实现回溯算法的,在第一次使用二维矩阵的情况下,又做了一次改一维的优化 但是算法效率仍然差强人意,因为使用递归函数的缘故 下面提供另一种回溯算法的实现,使用数据结构"栈" ...

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

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

  5. 手把手教你归并排序(非递归)

    今天,我们一起来学习归并排序的非递归算法吧! 目录 一.优势 二.实现原理 三.代码实现 一.优势 相比于递归算法,归并排序的非递归算法不用多次调用同一个函数,不会向递归算法一样因为函数嵌套调用次数太 ...

  6. java 快排非递归_C++ 中快排的递归和非递归实现

    快排的递归 void quickSort1(int* root,int low,int high) { int pat=root[low]; if(low { int i=low,j=high; wh ...

  7. java 反转二叉树 非递归_【刷算法】翻转二叉树的递归和非递归解法

    题目描述 操作给定的二叉树,将其变翻转为源二叉树的镜像. 输入描述: 1 1 / \ / \ 2 3 ------> 3 2 / \ / \ / \ / \ 4 5 6 7 7 6 5 4 解题 ...

  8. 【Java数据结构】非递归遍历二叉树

    目录 1. 定义二叉树结点类TreeNode 2. 前序遍历(非递归) 3. 中序遍历(非递归) 4. 后序遍历(非递归) 1. 定义二叉树结点类TreeNode public class TreeN ...

  9. 归并排序(递归实现+非递归实现+自然合并排序)

    归并排序的确是分治思想的经典代表.写了很多次,这次又有新的收获,过去用的是递归的实现方式,理论上任何用递归方法实现的代码都可以转换为非递归的形式,所以此例也不例外.然后再用非递归的实现方法上进行改进, ...

最新文章

  1. weblogic 安装教程
  2. sharepoint简单说明
  3. C++11中的std::function
  4. LeetCode 688. “马”在棋盘上的概率
  5. 鸿蒙荣耀9X公测,荣耀9X系列手机开启EMUI 10公测更新
  6. excel制作一个信息录入系统_Excel数据总是重复录入?使用这招,让系统帮你做检查,非常实用...
  7. 7个示例科普CPU CACHE(zz)
  8. 简单介绍三级分销系统开发源码
  9. C语言运算符的优先级与结合性
  10. 第五届山东ACM大赛汇总
  11. 线性代数学习笔记——第六讲——矩阵的转置
  12. channel estimation
  13. 5款良心电脑软件,有一款虽已停更,却依然免费使用
  14. 《幼儿园门禁管理系统可行性研究报告》
  15. 微服务-分布式事务seata
  16. spf打包解包_2020最新CentOS(linux下)安装7-Zip(7za压缩软件)以及解压命令,只打包不压缩,加密的方法...
  17. 【基于RT-Thread+RA6M4的智能鱼缸系统设计之鱼我所欲也】
  18. 是时候废除“网络君主制”啦?认识 Usenet ~
  19. C++库和C库的区别
  20. 沙箱支付宝alipay-easysdk java 支付能力对接

热门文章

  1. linux日志.pdf,一种用于LINUX的AUDIT日志分析方法.pdf
  2. 计算机硬件知识大赛,计算机知识技能大赛.doc
  3. php 地址获取百度经纬度,根据百度api获取一个地址的经纬度
  4. python解释执行器_有关Python脚本相关说明介绍
  5. nginx location匹配除了一个路径_nginx部署React项目
  6. C#基础18:内置委托类型Action和Func
  7. Unity3D基础17:物体中心点与物体旋转
  8. bzoj 3609: [Heoi2014]人人尽说江南好(博弈)
  9. opencv 利用图像轮廓函数填充圆环内部 图像轮廓函数应用小例子
  10. c#图片色阶调整、亮度调整