归并排序(非递归):自底向上

public class MergeSort {/*** @param arr   待排序的数组* @param left  本次归并的左边界* @param mid   本次归并的中间位置,也就是分界线* @param right 本次归并的右边界* @param <T>   泛型* @local aux   辅助空间(Auxiliary Space)*/private static <T extends Comparable<? super T>> void merge(T[] arr, int left, int mid, int right) {T[] aux = java.util.Arrays.copyOfRange(arr, left, right + 1);int i = left;int j = mid + 1;for (int t = left; t <= right; t++) {if (i > mid) {arr[t] = aux[j++ - left];} else if (j > right) {arr[t] = aux[i++ - left];} else if (aux[i - left].compareTo(aux[j - left]) < 0) {arr[t] = aux[i++ - left];} else {arr[t] = aux[j++ - left];}}}public static <T extends Comparable<? super T>> void sort(T[] arr, int left, int right) {int n = arr.length;for (int size = 1; size < n; size *= 2) {for (int i = 0; i < n - size; i += size * 2) {merge(arr, i, i + size - 1, Math.min(i + 2 * size - 1, n - 1));}}}public static <T extends Comparable<? super T>> void sort(T[] arr) {sort(arr, 0, arr.length - 1);}private static void printArr(Object[] arr) {for (Object o : arr) {System.out.print(o);System.out.print("\t");}System.out.println();}public static void main(String args[]) {Integer[] arr = {3, 5, 1, 7, 2, 9, 8, 0, 4, 6};printArr(arr);//3   5   1   7   2   9   8   0   4   6sort(arr);printArr(arr);//0   1   2   3   4   5   6   7   8   9}
}

归并排序(非递归)优化:merge前判断是否有必要进行归并

public class MergeSort {/*** @param arr   待排序的数组* @param left  本次归并的左边界* @param mid   本次归并的中间位置,也就是分界线* @param right 本次归并的右边界* @param <T>   泛型* @local aux   辅助空间(Auxiliary Space)*/private static <T extends Comparable<? super T>> void merge(T[] arr, int left, int mid, int right) {T[] aux = java.util.Arrays.copyOfRange(arr, left, right + 1);int i = left;int j = mid + 1;for (int t = left; t <= right; t++) {if (i > mid) {arr[t] = aux[j++ - left];} else if (j > right) {arr[t] = aux[i++ - left];} else if (aux[i - left].compareTo(aux[j - left]) < 0) {arr[t] = aux[i++ - left];} else {arr[t] = aux[j++ - left];}}}public static <T extends Comparable<? super T>> void sort(T[] arr, int left, int right) {int n = arr.length;for (int size = 1; size < n; size *= 2) {for (int i = 0; i < n - size; i += size * 2) {if (arr[i + size - 1].compareTo(arr[i + size]) > 0) {merge(arr, i, i + size - 1, Math.min(i + 2 * size - 1, n - 1));}}}}public static <T extends Comparable<? super T>> void sort(T[] arr) {sort(arr, 0, arr.length - 1);}private static void printArr(Object[] arr) {for (Object o : arr) {System.out.print(o);System.out.print("\t");}System.out.println();}public static void main(String args[]) {Integer[] arr = {3, 5, 1, 7, 2, 9, 8, 0, 4, 6};printArr(arr);//3   5   1   7   2   9   8   0   4   6sort(arr);printArr(arr);//0   1   2   3   4   5   6   7   8   9}
}

递归排序(非递归)继续优化:对小规模数据使用插入排序

归并排序是对一组一组的数据进行归并。当这一组中的数很少时(暂定为4),使用插入排序。

public class MergeSort {/*** @param arr   待排序的数组* @param left  本次归并的左边界* @param mid   本次归并的中间位置,也就是分界线* @param right 本次归并的右边界* @param <T>   泛型* @local aux   辅助空间(Auxiliary Space)*/private static <T extends Comparable<? super T>> void merge(T[] arr, int left, int mid, int right) {T[] aux = java.util.Arrays.copyOfRange(arr, left, right + 1);int i = left;int j = mid + 1;for (int t = left; t <= right; t++) {if (i > mid) {arr[t] = aux[j++ - left];} else if (j > right) {arr[t] = aux[i++ - left];} else if (aux[i - left].compareTo(aux[j - left]) < 0) {arr[t] = aux[i++ - left];} else {arr[t] = aux[j++ - left];}}}private static <T extends Comparable<? super T>> void insertionSort(T[] arr, int left, int right) {for (int i = left + 1; i <= right; i++) {T temp = arr[i];int j = i - 1;while (j >= left && temp.compareTo(arr[j]) < 0) {arr[j + 1] = arr[j];j--;}arr[j + 1] = temp;}}public static <T extends Comparable<? super T>> void sort(T[] arr, int left, int right) {int len = arr.length;int smallSize = 4;//当规模小于4时采用插入排序for (int i = 0; i < len; i += smallSize) {insertionSort(arr, i, Math.min(i + smallSize - 1, len - 1));}for (int size = smallSize; size < len; size *= 2) {for (int i = 0; i < len - size; i += size * 2) {if (arr[i + size - 1].compareTo(arr[i + size]) > 0){merge(arr, i, i + size - 1, Math.min(i + 2 * size - 1, len - 1));}}}}public static <T extends Comparable<? super T>> void sort(T[] arr) {sort(arr, 0, arr.length - 1);}private static void printArr(Object[] arr) {for (Object o : arr) {System.out.print(o);System.out.print("\t");}System.out.println();}public static void main(String args[]) {Integer[] arr = {3, 5, 1, 7, 2, 9, 8, 0, 4, 6};printArr(arr);//3   5   1   7   2   9   8   0   4   6sort(arr);printArr(arr);//0   1   2   3   4   5   6   7   8   9}
}

  

转载于:https://www.cnblogs.com/noKing/p/7944804.html

归并排序(非递归,Java实现)相关推荐

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

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

  2. 归并排序非递归——C语言讲解

    之前发了一期归并排序递归版本 这期讲解一下非递归版本 用循环模拟 有没有人好奇 既然有了递归版本 为何还要搞非递归版本 这不是多此一举吗? 其实不然 正因为递归是基于栈帧的基础上实现的 是不断在栈上开 ...

  3. leetcode 77. Combinations-排列|递归|非递归|Java|Python

    原题链接:77. Combinations [思路-Java.Python]递归实现 采用回溯算法.这是一道 NP 难问题,时间复杂度没办法提高,用一个循环递归处理子问题,问题的终止条件是每个组合中的 ...

  4. 快排递归和非递归(java)

    思路:递归版思想没啥好说的,主要是细节,左右指针移动需要注意.这次尝试写非递归版,想的有点复杂了,其实类似树的前序遍历,细节见代码. import javafx.util.Pair; import j ...

  5. 数据结构--汉诺塔--借助栈实现非递归---Java

    1 /*汉诺塔非递归实现--利用栈 2 * 1.创建一个栈,栈中每个元素包含的信息:盘子编号,3个塔座的变量 3 * 2.先进栈,在利用循环判断是否栈空, 4 * 3.非空情况下,出栈,检查是否只有一 ...

  6. [剑指Offer]斐波那契数列、跳台阶、兔子数量问题(递归、非递归)(Java)

    剑指Offer题目 斐波那契数列 题目描述 [剑指Offer 7]大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). [剑指Offer 8]一只青蛙 ...

  7. 二叉树中序遍历非递归Java

    问题来源与描述 问题来源:LeetCode 94,二叉树的中序遍历 思路 二叉树的中序遍历顺序是左,根,右. 使用递归比较简单: class Solution {public List<Inte ...

  8. c语言归并排序数组不固定,归并排序非递归实现C语言

    话说这个东西写到凌晨3点27分,都没有写好.刚才睡醒了写完的.主要遇到的问题就是当数组大小不是2的幂的时候发生的 right_end 越界的时候.我的逻辑起初偏于复杂,后来重新组织逻辑,当发生 rig ...

  9. 算法分析:芯片测试问题 非递归 JAVA 有n片芯片,已知好芯片比坏芯片至少多1片......

    [芯片测试]有n片芯片,已知好芯片比坏芯片至少多1片.现在需要通过测试从中找出1片好芯片,测试方法如下:将2片芯片放到测试台上,2片芯片互相测试并报告测试结果(即好或者坏):其中,好芯片的报告是正确的 ...

最新文章

  1. 分享一个超棒的在线jQuery mobile原型设计开发工具 - codiqa
  2. asp.net ajax 怎么获取前端ul li_字节前端提前批面试题:触发了几次回流几次重绘...
  3. 额外篇 | ggplot (下)
  4. spark-jar冲突解决方案
  5. 处理 read_csv 报错 OSError:Initializing from file failed
  6. sql中in与php数组,格式化SQL“IN”子句的PHP数组
  7. 快速锁屏电脑快捷键_一学就会的8个电脑快捷键一定要掌握!堪称“高效”神器...
  8. jQuery 学习笔记 选择元素
  9. 基于HTML/CSS/JS的动态元素周期表
  10. 解决Chrome浏览器登录web系统一直报“验证码错误问题“
  11. PASCAL VOC 数据集详解与MS COCO组合方式
  12. Yolo opencv刻度尺识别 刻度读数识别 水尺识别 水位识别源码
  13. mysql secure file_mysql secure-file-priv选项问题的解决方法
  14. 种子信息服务器,老司机揭秘:“种子”的前世今生
  15. 计算机数字音乐我的梦,我的音乐梦
  16. 长阳土家族自治县政府与升哲科技达成战略合作
  17. 小程序如何通过云开发获取手机号
  18. 认证授权那点事儿 —— OAuth 2.0
  19. 看linux centos版本信息,Linux CentOS查看操作系统版本信息
  20. ucsd计算机科学,UCSD计算机科学博士排名,谨记得细致看

热门文章

  1. bootstrap使用总结(导航在carousel居中之上)
  2. xp系统无法创建宽带连接服务器地址,XP下无法建立宽带拨号连接修复一例(新建连接向导选项为灰色)...
  3. 迷你世界维护服务器几点到几点,迷你世界服务器房间是什么 | 手游网游页游攻略大全...
  4. 下拉框选中事件ajax,LayUI中select下拉框选中触发事件
  5. 嵌入式Linux下跑自整定pid,告诉过你PID很重要,你不听
  6. ehcache config xml file
  7. php文章远程图片,php保存远程图片到本地 php正则匹配文章中的远程图片地址
  8. leetcode算法题--Russian Doll Envelopes
  9. acwing算法题--多重背包问题一
  10. OVS vswitchd启动(三十五)