算法(Algorithms)第4版 练习 2.2.11(2)
2024-09-04 21:15:31
关键代码:
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
最新文章
- 基于SOA架构的TDD测试驱动开发模式
- 原生JS实现MVVM模式
- ubuntu 解决中文zip乱码问题
- 使用NPOI读写Excel、Word
- Ibatis的环境搭建以及遇到的问题解决
- gulp+Babel 搭建ES6环境
- Carthage 安装和使用
- solaris之复习
- Tomcat部署(转)
- MegaCli监控RAID磁盘健康信息
- Linux nohup命令详解
- PHPCMSV9 采集网址后,再采集内容,报错:“采集采集内容 没有找到网址列表,请先进行网址采集”
- linux下JDK,tomcat的安装与环境变量配置
- 扩展ArcGIS API for Silverlight/WPF 中的TextSymbol支持角度标注
- hadoop源码编译
- cocos2dx android运行Luac编译后的lua代码
- app 性能
- (转)小谈keepalived vip漂移原理与VRRP协议
- LVS-概念
- 为什么要用GCD-Swift2.x
热门文章
- Atitit.Java&#160;exe&#160;bat&#160;&#160;作为windows系统服务程序运行
- HTML5 2D平台游戏开发#7Camera
- 【LeetCode-面试算法经典-Java实现】【114-Flatten Binary Tree to Linked List(二叉树转单链表)】
- Java并发编程(一)学习大纲
- 使用javac,手动编译一个java文件的方法
- Http和Socket 优劣比较 使用场景选择_转
- 【SQLServer2008】之Win10 安装 SQL Server 2008
- [ACM] POJ 3740 Easy Finding (DLX模板题)
- 算不算类似微信小程序
- u-boot下载模式LCD显示图片修改方法(基于TQ2440)