Algs4-2.2.22三向归并排序
2.2.22三向归并排序。假设每次我们是把数组分成三个部分而不是两个部分并将它们分别排序,然后进行三向归并。这种算法的运行时间的增长数量级是多少?
运算时间增长数量级是O(Nlg3N)。
public class E2d2d22
{
public static void sort(Comparable[] a)
{
Comparable[] aux=new Comparable[a.length];
sort(a,aux,0,a.length-1);
}
private static void sort(Comparable[] a,Comparable[] aux,int lo,int hi)
{
if (hi<=lo) return ;
int m1=lo+(hi-lo)/3;
int m2=m1+1+(hi-m1-1)/2;
sort(a,aux,lo,m1);
sort(a,aux,m1+1,m2);
sort(a,aux,m2+1,hi);
merge(a,aux,lo,m1,m2,hi);
}
private static void merge(Comparable[] a,Comparable[] aux,int lo,int m1,int m2,int hi)
{
for(int k=lo;k<=hi;k++)
aux[k]=a[k];
//
int aIndex=lo;
int bIndex=m1+1;
int cIndex=m2+1;
Comparable A,B,C;
Double maxValue=Double.MAX_VALUE;
for(int k=lo;k<=hi;k++)
{
if (aIndex<=m1) A=aux[aIndex]; else A=maxValue;
if (bIndex<=m2) B=aux[bIndex]; else B=maxValue;
if (cIndex<=hi) C=aux[cIndex]; else C=maxValue;
//
if(less(A,B) && less(A,C))
{a[k]=A;aIndex++;}
else if(less(B,A) && less(B,C))
{a[k]=B;bIndex++;}
else if(less(C,A) && less(C,B))
{a[k]=C;cIndex++;}
else
{a[k]=A;aIndex++;}
}
}
private static boolean less(Comparable v,Comparable w)
{ return v.compareTo(w)<0;}
private static void exch(Comparable[] a,int i,int j)
{
Comparable t=a[i];
a[i]=a[j];
a[j]=t;
}
public static boolean isSorted(Comparable[] a)
{
for(int i=1;i<a.length;i++)
if(less(a[i],a[i-1])) return false;
return true;
}
public static void main(String[] args)
{
Integer N=Integer.parseInt(args[0]);
Comparable[] a=new Comparable[N];
for(int i=0;i<N;i++)
a[i]=StdRandom.uniform();
sort(a);
StdOut.printf("%s",isSorted(a));
}
}
转载于:https://www.cnblogs.com/longjin2018/p/9860119.html
Algs4-2.2.22三向归并排序相关推荐
- 《30天吃掉那只 TensorFlow2.0》 2-2 三种计算图
2-2 三种计算图 有三种计算图的构建方式:静态计算图,动态计算图,以及Autograph. 在TensorFlow1.0时代,采用的是静态计算图,需要先使用TensorFlow的各种算子创建计算图, ...
- 排序算法第三篇——归并排序
算法描述: 归并(Merge)排序是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列. 对一个数组进行归并排序主 ...
- 排序算法杂谈(三) —— 归并排序的非递归实现
1. 递归 在众多排序算法中,归并排序(Merge Sort)和快速排序(Quick Sort)都是时间复杂度为 O(nlog2n) 的高效排序. 这两种排序有一种共性,就是运用到了递归的思想. 在程 ...
- 排序算法总结之归并排序
一,归并排序介绍 归并排序是一个典型的基于分治的递归算法.它不断地将原数组分成大小相等的两个子数组(可能相差1),最终当划分的子数组大小为1时(下面代码第17行left小于right不成立时) ,将划 ...
- 排序(下):归并排序和快速排序
本文是学习算法的笔记,<数据结构与算法之美>,极客时间的课程 归并排序和快速排序,是两种时间复杂度为O(nlogn)的排序,适合大规模的排序,比上节所说的三种排序(冒泡.插入.选择)更常用 ...
- 归并排序执行次数_归并排序过程、时间复杂度分析及改进
前言 上一篇文章,介绍过第一种基于分治策略的排序算法--快速排序.接下来我们来讨论另一种基于分治策略的排序算法,归并排序.归并排序也被认为是一种时间复杂度最优的算法,我们还是按照基本过程,代码,最坏时 ...
- python 归并排序(详解)
一.归并排序 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后 ...
- TypeScript实现归并排序
归并排序的流程 归并排序是一种基于分治思想的排序算法,其基本思路可以分为三个步骤: 步骤一:分解(Divide):归并排序使用递归算法来实现分解过程,具体实现中可以分为以下几个步骤: 如果待排序数组长 ...
- 适用于大规模数据排序(归并排序、快速排序)
一.归并排序 1.1.分析 先把数组从中间分成前后两部分,然后对前后两部分分别排序,再将排好序的两部分合并在一起,这样整个数组就都有序了. 1.2.使用递推思路实现 ①先写出递推公式:[mergeSo ...
最新文章
- matlab外部接口简介
- 理解int的存储方式以及VS二进制编辑器的使用
- /bin/bash^M解决办法
- 【网寻】mui - 点击事件
- linux shell wc 命令
- if中加return_答应我,别再 if/else 走天下了可以吗?
- Eclipse中代码编辑背景颜色修改和XML字体修改
- java知识大全积累篇
- SAP 电商云 Spartacus UI 的 feature module 设计原理
- 干货!sqlserver数据库所有知识点总结整理,含代码(挺全的)
- centos7下docker启动失败解决
- SENet(ILSVRC2017-最后一个冠军)
- 【论文解读】AAAI 2020 持续学习语义理解框架ERNIE 2.0
- 深度学习神经网络中的梯度检查
- 大数据面试题及答案-汇总版
- 博客好助手——截图工具Snipaste试用
- android 让程序在后台运行,android – 如何让我的应用程序在后台运行?
- 【渝粤教育】电大中专电商运营实操 (24)作业 题库
- ios审核提示:您的 Apple Developer Program 帐户已被标记为删除
- LINUX保留原分区,linux 分区扩展 (保留数据)
热门文章
- oracle bi publisher 安装,Oracle BI Publisher 企业版安装后的配置(BI Publisher Enterprise Edition)...
- sql优化的方法及思路_微生物发酵 技术优化思路 与方法
- c语言 如何创建adt_C语言探索之旅 | 第二部分第六课:创建你自己的变量类型
- 18年石油大学c语言网考答案,石油大学华东C语言2018在线考试.doc
- java简单小程序_Java简易登录注册小程序
- 现在好用的mysql客户端_还在用 Navicat 的,可以试试这几款免费且好用的 MySQL 客户端...
- 时间序列python复杂网络实例_基于时间序列数据的复杂网络重构
- Windows:系统环境变量配置提示系统环境变量太大的问题三种解决方案亲测可用
- 吴恩达机器学习笔记:(一)机器学习方法简介
- 图像“位操作”有什么用?