归并排序(非递归,Java实现)
归并排序(非递归):自底向上
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实现)相关推荐
- java 归并排序 非递归_归并排序-递归及非递归的JAVA实现
归并排序介绍 平均时间复杂度: O(NLogN) 最好情况时间复杂度: O(NLogN) 最差情况时间复杂度: O(NLogN) 所需要额外空间: 递归:O(N + LogN), 非递归:O(N) 稳 ...
- 归并排序非递归——C语言讲解
之前发了一期归并排序递归版本 这期讲解一下非递归版本 用循环模拟 有没有人好奇 既然有了递归版本 为何还要搞非递归版本 这不是多此一举吗? 其实不然 正因为递归是基于栈帧的基础上实现的 是不断在栈上开 ...
- leetcode 77. Combinations-排列|递归|非递归|Java|Python
原题链接:77. Combinations [思路-Java.Python]递归实现 采用回溯算法.这是一道 NP 难问题,时间复杂度没办法提高,用一个循环递归处理子问题,问题的终止条件是每个组合中的 ...
- 快排递归和非递归(java)
思路:递归版思想没啥好说的,主要是细节,左右指针移动需要注意.这次尝试写非递归版,想的有点复杂了,其实类似树的前序遍历,细节见代码. import javafx.util.Pair; import j ...
- 数据结构--汉诺塔--借助栈实现非递归---Java
1 /*汉诺塔非递归实现--利用栈 2 * 1.创建一个栈,栈中每个元素包含的信息:盘子编号,3个塔座的变量 3 * 2.先进栈,在利用循环判断是否栈空, 4 * 3.非空情况下,出栈,检查是否只有一 ...
- [剑指Offer]斐波那契数列、跳台阶、兔子数量问题(递归、非递归)(Java)
剑指Offer题目 斐波那契数列 题目描述 [剑指Offer 7]大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). [剑指Offer 8]一只青蛙 ...
- 二叉树中序遍历非递归Java
问题来源与描述 问题来源:LeetCode 94,二叉树的中序遍历 思路 二叉树的中序遍历顺序是左,根,右. 使用递归比较简单: class Solution {public List<Inte ...
- c语言归并排序数组不固定,归并排序非递归实现C语言
话说这个东西写到凌晨3点27分,都没有写好.刚才睡醒了写完的.主要遇到的问题就是当数组大小不是2的幂的时候发生的 right_end 越界的时候.我的逻辑起初偏于复杂,后来重新组织逻辑,当发生 rig ...
- 算法分析:芯片测试问题 非递归 JAVA 有n片芯片,已知好芯片比坏芯片至少多1片......
[芯片测试]有n片芯片,已知好芯片比坏芯片至少多1片.现在需要通过测试从中找出1片好芯片,测试方法如下:将2片芯片放到测试台上,2片芯片互相测试并报告测试结果(即好或者坏):其中,好芯片的报告是正确的 ...
最新文章
- 分享一个超棒的在线jQuery mobile原型设计开发工具 - codiqa
- asp.net ajax 怎么获取前端ul li_字节前端提前批面试题:触发了几次回流几次重绘...
- 额外篇 | ggplot (下)
- spark-jar冲突解决方案
- 处理 read_csv 报错 OSError:Initializing from file failed
- sql中in与php数组,格式化SQL“IN”子句的PHP数组
- 快速锁屏电脑快捷键_一学就会的8个电脑快捷键一定要掌握!堪称“高效”神器...
- jQuery 学习笔记 选择元素
- 基于HTML/CSS/JS的动态元素周期表
- 解决Chrome浏览器登录web系统一直报“验证码错误问题“
- PASCAL VOC 数据集详解与MS COCO组合方式
- Yolo opencv刻度尺识别 刻度读数识别 水尺识别 水位识别源码
- mysql secure file_mysql secure-file-priv选项问题的解决方法
- 种子信息服务器,老司机揭秘:“种子”的前世今生
- 计算机数字音乐我的梦,我的音乐梦
- 长阳土家族自治县政府与升哲科技达成战略合作
- 小程序如何通过云开发获取手机号
- 认证授权那点事儿 —— OAuth 2.0
- 看linux centos版本信息,Linux CentOS查看操作系统版本信息
- ucsd计算机科学,UCSD计算机科学博士排名,谨记得细致看
热门文章
- bootstrap使用总结(导航在carousel居中之上)
- xp系统无法创建宽带连接服务器地址,XP下无法建立宽带拨号连接修复一例(新建连接向导选项为灰色)...
- 迷你世界维护服务器几点到几点,迷你世界服务器房间是什么 | 手游网游页游攻略大全...
- 下拉框选中事件ajax,LayUI中select下拉框选中触发事件
- 嵌入式Linux下跑自整定pid,告诉过你PID很重要,你不听
- ehcache config xml file
- php文章远程图片,php保存远程图片到本地 php正则匹配文章中的远程图片地址
- leetcode算法题--Russian Doll Envelopes
- acwing算法题--多重背包问题一
- OVS vswitchd启动(三十五)