算法(Algorithms)第4版 练习 2.3.25
代码实现:
public static void sort(Comparable[] a) {
StdRandom.shuffle(a);//eliminate dependence on input
StdOut.print("After shuffle:");//for test
show(a);//for test
sort(a, 0, a.length-1);
}
private static void sort(Comparable[] a, int lo, int hi) {
if(hi <= lo + CUTOFF) {
if(hi > lo)
Insertion.sort(a, lo, hi);
return;
}
int j = partition(a, lo, hi);
sort(a, lo, j-1);
sort(a, j+1, hi);
}
单元测试:
package com.qiusongde; import edu.princeton.cs.algs4.In;
import edu.princeton.cs.algs4.StdOut;
import edu.princeton.cs.algs4.StdRandom; public class QuickCutoffInsertion { private static int CUTOFF = 4;//default value is 8 public static void setCutoff(int cutoff) {
assert cutoff > 0;
CUTOFF = cutoff;
} public static void sort(Comparable[] a) {
StdRandom.shuffle(a);//eliminate dependence on input
StdOut.print("After shuffle:");//for test
show(a);//for test
sort(a, 0, a.length-1);
} private static void sort(Comparable[] a, int lo, int hi) { if(hi <= lo + CUTOFF) {
if(hi > lo)
Insertion.sort(a, lo, hi);
return;
} int j = partition(a, lo, hi);
sort(a, lo, j-1);
sort(a, j+1, hi); } private static int partition(Comparable[] a, int lo, int hi) { int i = lo;
int j = hi + 1;
Comparable v = a[lo]; StdOut.println();//for test
StdOut.printf("partition(input, %4d, %4d)\n", lo, hi);//for test while(true) {
while(less(a[++i], v))//find item larger or equal to v
if(i == hi)
break;
while(less(v, a[--j]));//not need to worry about j will be out of bound StdOut.println("i:" + i + " j:" + j);//for test if(i >= j)//cross
break; exch(a, i, j);
show(a);//for test
}
exch(a, lo, j); StdOut.printf("j is %4d\n", j);//for test
show(a);//for test return j; } private static void exch(Comparable[] a, int i, int j) { Comparable t = a[i];
a[i] = a[j];
a[j] = t; } 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[] a = In.readStrings();
show(a);//for test
sort(a);
assert isSorted(a);
show(a);//for test
} }
输出结果:
K R A T E L E P U I M Q C X O S
After shuffle:E R K U M C X A I O E S T P Q L partition(input, 0, 15)
i:1 j:10
E E K U M C X A I O R S T P Q L
i:2 j:7
E E A U M C X K I O R S T P Q L
i:3 j:5
E E A C M U X K I O R S T P Q L
i:4 j:3
j is 3
C E A E M U X K I O R S T P Q L Insertion.sort(input, 0, 2)
A C E E M U X K I O R S T P Q L partition(input, 4, 15)
i:5 j:15
A C E E M L X K I O R S T P Q U
i:6 j:8
A C E E M L I K X O R S T P Q U
i:8 j:7
j is 7
A C E E K L I M X O R S T P Q U Insertion.sort(input, 4, 6)
A C E E I K L M X O R S T P Q U partition(input, 8, 15)
i:15 j:15
j is 15
A C E E I K L M U O R S T P Q X partition(input, 8, 14)
i:14 j:14
j is 14
A C E E I K L M Q O R S T P U X partition(input, 8, 13)
i:10 j:13
A C E E I K L M Q O P S T R U X
i:11 j:10
j is 10
A C E E I K L M P O Q S T R U X Insertion.sort(input, 8, 9)
A C E E I K L M O P Q S T R U X Insertion.sort(input, 11, 13)
A C E E I K L M O P Q R S T U X
A C E E I K L M O P Q R S T U X
性能测试:
package com.qiusongde;
import edu.princeton.cs.algs4.StdOut;
public class Exercise2325 {
public static void main(String[] args) {
String alg = "QuickCutoffInsertion";
int T = 10;//T trials
for(int N = 1000; N <= 1000000; N *= 10){
StdOut.println("N:" + N);
for(int M = 0; M <= 30; M++) {
QuickCutoffInsertion.setCutoff(M);
double time = SortCompare.timeRandomInput(alg, N, T);
StdOut.printf("%8.4f", time);
}
StdOut.println();
}
}
}
输出结果:
N:1000
0.0050 0.0030 0.0060 0.0060 0.0060 0.0060 0.0060 0.0030 0.0010 0.0010 0.0030 0.0010 0.0020 0.0010 0.0020 0.0010 0.0000 0.0010 0.0010 0.0000 0.0020 0.0000 0.0020 0.0010 0.0020 0.0000 0.0020 0.0020 0.0000 0.0020 0.0000
N:10000
0.0200 0.0180 0.0140 0.0140 0.0130 0.0130 0.0140 0.0130 0.0120 0.0150 0.0130 0.0130 0.0100 0.0150 0.0120 0.0130 0.0130 0.0110 0.0120 0.0130 0.0150 0.0110 0.0120 0.0120 0.0150 0.0130 0.0130 0.0140 0.0140 0.0110 0.0150
N:100000
0.2070 0.2070 0.2010 0.1960 0.1970 0.1970 0.2040 0.2010 0.1800 0.1820 0.1820 0.1780 0.1790 0.1820 0.1800 0.1810 0.1850 0.1860 0.1750 0.1810 0.1810 0.1820 0.1790 0.1830 0.1810 0.1820 0.1840 0.1830 0.1830 0.1840 0.1830
N:1000000
3.9260 3.9100 3.9300 3.9050 3.8640 3.8250 3.7930 3.8780 3.8090 3.8360 3.7860 3.8530 3.8130 3.7770 3.7800 3.7570 3.8220 3.7800 3.8220 3.7850 3.7970 3.8020 3.8530 3.8340 3.8710 3.7660 3.8080 3.8580 3.8350 3.8890 3.7810
算法(Algorithms)第4版 练习 2.3.25的更多相关文章
- 1.2 Data Abstraction(算法 Algorithms 第4版)
1.2.1 package com.qiusongde; import edu.princeton.cs.algs4.Point2D; import edu.princeton.cs.algs4.St ...
- 1.1 BASIC PROGRAMMING MODEL(算法 Algorithms 第4版)
1.1.1 private static void exercise111() { StdOut.println("1.1.1:"); StdOut.println((0+15)/ ...
- ubuntu命令行下java工程编辑与算法(第四版)环境配置
ubuntu命令行下java工程编辑与算法(第四版)环境配置 java 命令行 javac java 在学习算法(第四版)中的实例时,因需要安装配套的java编译环境,可是在编译java文件的时候总是 ...
- 配置算法(第4版)的Java编译环境
1. 下载 1.1 JDK http://www.oracle.com/technetwork/java/javase/downloads/index.html选择“Windows x64 180.5 ...
- 算法(第四版)C# 习题题解——1.3.49 用 6 个栈实现一个 O(1) 队列
因为这个解法有点复杂,因此单独开一贴介绍. 那么这里就使用六个栈来解决这个问题. 这个算法来自于这篇论文. 原文里用的是 Pure Lisp,不过语法很简单,还是很容易看懂的. 先导知识——用两个栈模 ...
- 在Eclipse下配置算法(第四版)运行环境
第一步:配置Eclipse运行环境 Eclipse运行环境配置过程是很简单的,用过Eclipse进行java开发或学习的同学应该都很熟悉这个过程了. 配置过程: (1)系统环境:Windows7 64 ...
- 排序算法总结(C语言版)
排序算法总结(C语言版) 1. 插入排序 1.1 直接插入排序 1.2 Shell排序 2. 交换排序 2.1 冒泡排序 2.2 快速排序 3. 选择 ...
- 算法(第四版)C#题解——2.1
算法(第四版)C#题解——2.1 写在前面 整个项目都托管在了 Github 上:https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csh ...
- 《算法》第四版 IDEA 运行环境的搭建
<算法>第四版 IDEA 运行环境的搭建 新建 模板 小书匠 在搭建之初,我是想不到会出现如此之多的问题.我看了网上的大部分教程,都是基于Eclipse搭建的,还没有使用IDEA搭建的教程 ...
- 常见排序算法题(java版)
常见排序算法题(java版) //插入排序: package org.rut.util.algorithm.support; import org.rut.util.algorithm.Sor ...
随机推荐
- Atitit.跨平台预定义函数 魔术方法 魔术函数 钩子函数 api兼容性草案 v2 q216 java c# php js.docx
Atitit.跨平台预定义函数 魔术方法 魔术函数 钩子函数 api兼容性草案 v2 q216 java c# php js.docx 1.1. 预定义函数 魔术方法 魔术函数是什么1 1.2. & ...
- Python内置函数之sorted()
sorted(iterable,*,key=None,reverse=False) 对可迭代对象进行排序,默认ASCII进行排序. 例子: sorted(iterable,*,key=None,rev ...
- 机器学习10—K-均值聚类学习笔记
机器学习实战之K-Means算法 test10.py #-*- coding:utf-8 import sys sys.path.append("kMeans.py") impor ...
- PropertyUtils复制BigDecimal异常
PropertyUtils复制BigDecimal会引发异常,要注意
- 什么是 Service Mesh
作者|敖小剑 微服务方兴未艾如火如荼之际,在 spring cloud 等经典框架之外,Service Mesh 技术正在悄然兴起.到底什么是 Service Mesh,它的出现能带来什么,又能改变什 ...
- laravel学习之路3 数据库相关
读写分离之多个读? 有 'host' => $readHosts[array_rand($readHosts)], 上面的好像有缓存问题php artisan config:cache ] ); ...
- php != 和 !== 的区别
== and != do not take into account the data type of the variables you compare. So these would all re ...
- STM32 Option Bytes位 重置为出厂设置
STM32 Option Bytes位 重置为出厂设置 JLINK 按照说明,在IAR安装目录下找到指定的运行程序JLinkSTM32.exe(D:\Program Files (x86)\IAR S ...
- 仿百度壁纸client(五)——实现搜索动画GestureDetector手势识别,动态更新搜索keyword
仿百度壁纸client(五)--实现搜索动画GestureDetector手势识别,动态更新搜索关键字 百度壁纸系列 仿百度壁纸client(一)--主框架搭建,自己定义Tab + ViewPager ...
- Xshell连接不上行Linux系统
之前出现了.我的Linux系统上的主机可以ping通windows的一台电脑, windows也可以ping的通Linux.但是Xshell不能连接. 第一,我感觉是不是我Linux系统的端口被防火墙 ...