关键代码:

    private static void sort(Comparable[] input, int lo, int hi) {

        if(lo >= hi)//just one entry in array
return; int mid = lo + (hi-lo)/2;
sort(input, lo, mid);
sort(input, mid+1, hi); if(!less(input[mid+1],input[mid]))//input[mid+1] >= input[mid]
return; merge(input, lo, mid, hi); }

整体:

package com.qiusongde;

import edu.princeton.cs.algs4.In;
import edu.princeton.cs.algs4.StdOut; public class MergeSkipMerge { private static Comparable[] aux; public static void sort(Comparable[] input) {
int N = input.length;
aux = new Comparable[N];
sort(input, 0, N-1);
} private static void sort(Comparable[] input, int lo, int hi) { if(lo >= hi)//just one entry in array
return; int mid = lo + (hi-lo)/2;
sort(input, lo, mid);
sort(input, mid+1, hi); if(!less(input[mid+1],input[mid]))//input[mid+1] >= input[mid]
return; merge(input, lo, mid, hi); } private static void merge(Comparable[] input, int lo, int mid, int hi) { //copy input[lo,hi] to aux[lo,hi]
for(int i = lo; i <= hi; i++) {
aux[i] = input[i];
} int i = lo;
int j = mid + 1;
for(int k = lo; k <= hi; k++) {
if(i > mid)
input[k] = aux[j++];
else if(j > hi)
input[k] = aux[i++];
else if(less(aux[j], aux[i]))
input[k] = aux[j++];
else
input[k] = aux[i++];
} StdOut.printf("merge(input, %4d, %4d, %4d)", lo, mid, hi);
show(input);//for test } private static boolean less(Comparable v, Comparable w) { return v.compareTo(w) < 0; } private static void show(Comparable[] a) { //print the array, on a single line.
for(int i = 0; i < a.length; i++) {
StdOut.print(a[i] + " ");
}
StdOut.println(); } 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) { //Read strings from standard input, sort them, and print.
String[] input = In.readStrings();
show(input);//for test
sort(input);
assert isSorted(input);
show(input);//for test } }

测试结果:

M E R G E S O R T E X A M P L E
merge(input, 0, 0, 1)E M R G E S O R T E X A M P L E
merge(input, 2, 2, 3)E M G R E S O R T E X A M P L E
merge(input, 0, 1, 3)E G M R E S O R T E X A M P L E
merge(input, 4, 5, 7)E G M R E O R S T E X A M P L E
merge(input, 0, 3, 7)E E G M O R R S T E X A M P L E
merge(input, 8, 8, 9)E E G M O R R S E T X A M P L E
merge(input, 10, 10, 11)E E G M O R R S E T A X M P L E
merge(input, 8, 9, 11)E E G M O R R S A E T X M P L E
merge(input, 14, 14, 15)E E G M O R R S A E T X M P E L
merge(input, 12, 13, 15)E E G M O R R S A E T X E L M P
merge(input, 8, 11, 15)E E G M O R R S A E E L M P T X
merge(input, 0, 7, 15)A E E E E G L M M O P R R S T X
A E E E E G L M M O P R R S T X

性能对比:

For 20000 random Doubles 1000 trials
Merge is 3.6s MergeFasterM is 3.3s MergeUseInsert is 3.2s MergeSkipMerge is 3.4s

最新文章

  1. 基于SOA架构的TDD测试驱动开发模式
  2. 原生JS实现MVVM模式
  3. ubuntu 解决中文zip乱码问题
  4. 使用NPOI读写Excel、Word
  5. Ibatis的环境搭建以及遇到的问题解决
  6. gulp+Babel 搭建ES6环境
  7. Carthage 安装和使用
  8. solaris之复习
  9. Tomcat部署(转)
  10. MegaCli监控RAID磁盘健康信息
  11. Linux nohup命令详解
  12. PHPCMSV9 采集网址后,再采集内容,报错:“采集采集内容 没有找到网址列表,请先进行网址采集”
  13. linux下JDK,tomcat的安装与环境变量配置
  14. 扩展ArcGIS API for Silverlight/WPF 中的TextSymbol支持角度标注
  15. hadoop源码编译
  16. cocos2dx android运行Luac编译后的lua代码
  17. app 性能
  18. (转)小谈keepalived vip漂移原理与VRRP协议
  19. LVS-概念
  20. 为什么要用GCD-Swift2.x

热门文章

  1. Atitit.Java&#160;exe&#160;bat&#160;&#160;作为windows系统服务程序运行
  2. HTML5 2D平台游戏开发#7Camera
  3. 【LeetCode-面试算法经典-Java实现】【114-Flatten Binary Tree to Linked List(二叉树转单链表)】
  4. Java并发编程(一)学习大纲
  5. 使用javac,手动编译一个java文件的方法
  6. Http和Socket 优劣比较 使用场景选择_转
  7. 【SQLServer2008】之Win10 安装 SQL Server 2008
  8. [ACM] POJ 3740 Easy Finding (DLX模板题)
  9. 算不算类似微信小程序
  10. u-boot下载模式LCD显示图片修改方法(基于TQ2440)