归并排序-bottom-up(非递归版本)
来源:互联网 发布:电商产品 知乎 编辑:程序博客网 时间:2024/05/19 20:38
Bottom-up mergesort
由于之前讨论的归并排序时用到的是递归的方法;而递归会带来很大的开销,本节讨论由底向上的非递归
版本的归并排序
思想:
- 对于给定的数组,设置变量
sz
为每次归并元素的个数。- 首先sz为1,也就是每单个元素归并(如:45和23归并成23、45),然后设置
sz=sz+sz
、也就是2,也就是使得数组中每两个元素归并;依次类推。
图解:
代码:
package mergesort;public class MergeSort { public static int CUTOFF = 7; public static void main(String[] args) { int a [] = {45,23,11,89,77,98,4,28,65,43}; sort(a); for(int ele : a) { System.out.println(ele); } } private static void merge(int a[], int aux[], int lo, int mid, int hi) { for(int k=lo; k<=hi; k++) { aux[k] = a[k]; } int i = lo; int j = mid+1; for(int k = lo; k<=hi; k++) { if(i>mid) {a[k] = aux[j++];} else if(j>hi) {a[k] = aux[i++];} else if(aux[j] < aux[i]) {a[k] = aux[j++];} else a[k] = aux[i++]; } } private static void sort(int a[]) {// int aux[] = new int[a.length];// sort(a, aux, 0, a.length-1); int N = a.length; int aux[] = new int[N]; for(int sz=1; sz<N; sz = sz+sz) { // sz从1开始;每次循环,sz变为两倍。 for(int lo=0; lo<N-sz; lo+=sz+sz) merge(a, aux, lo, lo+sz-1, Math.min(lo+sz+sz-1, N-1)); // 对于每sz个子序列,合并成2*sz个元素的有序子序列。 } }}
阅读全文
0 0
- 归并排序-bottom-up(非递归版本)
- 排序-归并排序(非递归版本)
- 【排序】归并排序(递归和非递归版本)
- 归并排序 非递归
- 归并排序非递归
- 归并排序(非递归)
- 归并排序(非递归)
- 快速排序 归并排序的非递归版本 备忘
- 归并排序 (非递归版本) C实现~
- 归并排序(非递归)
- 归并排序 非递归程序
- 非递归实现归并排序
- 非递归的归并排序
- 归并排序非递归算法
- 非递归的归并排序
- 非递归实现归并排序
- 归并排序非递归实现
- 归并排序-非递归版
- 【UML】关系之依赖关系
- 用数据描述故事
- 适用于Linux桌面歌词应用程序MusixMatch
- 线性表之链表
- 实验一顺序表的实现
- 归并排序-bottom-up(非递归版本)
- 2.1 SQLite数据库的创建和升级
- 软件工程概述
- python爬虫系列(七):XPath的使用
- 欢迎使用CSDN-markdown编辑器
- 51nod 连环进阶题 1118-1119-1120
- Nginx基本介绍
- ionic2集成crosswalk使用WebRTC视频通话
- AndroidStudio NDK开发 c环境调用java代码