算法Sedgewick第四版-第1章基础-2.1Elementary Sortss-003比较算法及算法的可视化
2016-04-22 12:23
676 查看
一、介绍
1.
2.
二、代码
1.
2.
3.
4.
1.
2.
二、代码
1.
package algorithms.elementary21; /****************************************************************************** * Compilation: javac SortCompare.java * Execution: java SortCompare alg1 alg2 N T * Dependencies: StdOut.java Stopwatch.java * * Sort N random real numbers, T times using the two * algorithms specified on the command line. * * % java SortCompare Insertion Selection 1000 100 * For 1000 random Doubles * Insertion is 1.7 times faster than Selection * * Note: this program is designed to compare two sorting algorithms with * roughly the same order of growth, e,g., insertion sort vs. selection * sort or mergesort vs. quicksort. Otherwise, various system effects * (such as just-in-time compiliation) may have a significant effect. * One alternative is to execute with "java -Xint", which forces the JVM * to use interpreted execution mode only. * ******************************************************************************/ import java.util.Arrays; import algorithms.analysis14.Stopwatch; import algorithms.util.StdOut; import algorithms.util.StdRandom; public class SortCompare { public static double time(String alg, Double[] a) { Stopwatch sw = new Stopwatch(); if (alg.equals("Insertion")) Insertion.sort(a); else if (alg.equals("InsertionX")) InsertionX.sort(a); else if (alg.equals("BinaryInsertion")) BinaryInsertion.sort(a); else if (alg.equals("Selection")) Selection.sort(a); else if (alg.equals("Bubble")) Bubble.sort(a); else if (alg.equals("Shell")) Shell.sort(a); else if (alg.equals("Merge")) Merge.sort(a); else if (alg.equals("MergeX")) MergeX.sort(a); else if (alg.equals("MergeBU")) MergeBU.sort(a); else if (alg.equals("Quick")) Quick.sort(a); else if (alg.equals("Quick3way")) Quick3way.sort(a); else if (alg.equals("QuickX")) QuickX.sort(a); else if (alg.equals("Heap")) Heap.sort(a); else if (alg.equals("System")) Arrays.sort(a); else throw new IllegalArgumentException("Invalid algorithm: " + alg); return sw.elapsedTime(); } // Use alg to sort T random arrays of length N. public static double timeRandomInput(String alg, int N, int T) { double total = 0.0; Double[] a = new Double ; // Perform one experiment (generate and sort an array). for (int t = 0; t < T; t++) { for (int i = 0; i < N; i++) a[i] = StdRandom.uniform(); total += time(alg, a); } return total; } // Use alg to sort T random arrays of length N. public static double timeSortedInput(String alg, int N, int T) { double total = 0.0; Double[] a = new Double ; // Perform one experiment (generate and sort an array). for (int t = 0; t < T; t++) { for (int i = 0; i < N; i++) a[i] = 1.0 * i; total += time(alg, a); } return total; } public static void main(String[] args) { String alg1 = args[0]; String alg2 = args[1]; int N = Integer.parseInt(args[2]); int T = Integer.parseInt(args[3]); double time1, time2; if (args.length == 5 && args[4].equals("sorted")) { time1 = timeSortedInput(alg1, N, T); // Total for alg1. time2 = timeSortedInput(alg2, N, T); // Total for alg2. } else { time1 = timeRandomInput(alg1, N, T); // Total for alg1. time2 = timeRandomInput(alg2, N, T); // Total for alg2. } StdOut.printf("For %d random Doubles\n %s is", N, alg1); StdOut.printf(" %.1f times faster than %s\n", time2/time1, alg2); } }
2.
package algorithms.elementary21; import algorithms.util.StdDraw; import algorithms.util.StdRandom; /****************************************************************************** * Compilation: javac InsertionBars.java * Execution: java InsertionBars N * Dependencies: StdDraw.java * * Insertion sort N random real numbers between 0 and 1, visualizing * the results by ploting bars with heights proportional to the values. * * % java InsertionBars 20 * ******************************************************************************/ public class InsertionBars { public static void sort(double[] a) { int N = a.length; for (int i = 0; i < N; i++) { int j = i; while (j >= 1 && less(a[j], a[j-1])) { exch(a, j, j-1); j--; } show(a, i, j); } } private static void show(double[] a, int i, int j) { StdDraw.setYscale(-a.length + i + 1, i); StdDraw.setPenColor(StdDraw.LIGHT_GRAY); for (int k = 0; k < j; k++) StdDraw.line(k, 0, k, a[k]*.6); StdDraw.setPenColor(StdDraw.BOOK_RED); StdDraw.line(j, 0, j, a[j]*.6); StdDraw.setPenColor(StdDraw.BLACK); for (int k = j+1; k <= i; k++) StdDraw.line(k, 0, k, a[k]*.6); StdDraw.setPenColor(StdDraw.LIGHT_GRAY); for (int k = i+1; k < a.length; k++) StdDraw.line(k, 0, k, a[k]*.6); } private static boolean less(double v, double w) { return v < w; } private static void exch(double[] a, int i, int j) { double t = a[i]; a[i] = a[j]; a[j] = t; } public static void main(String[] args) { int N = Integer.parseInt(args[0]); StdDraw.setCanvasSize(160, 640); StdDraw.setXscale(-1, N+1); StdDraw.setPenRadius(.006); double[] a = new double ; for (int i = 0; i < N; i++) a[i] = StdRandom.uniform(); sort(a); } }
3.
package algorithms.elementary21; import algorithms.util.StdDraw; import algorithms.util.StdRandom; /****************************************************************************** * Compilation: javac SelectionBars.java * Execution: java SelectionBars N * Dependencies: StdDraw.java * * Selection sort N random real numbers between 0 and 1, visualizing * the results by ploting bars with heights proportional to the values. * * % java SelectionBars 20 * ******************************************************************************/ public class SelectionBars { public static void sort(double[] a) { int N = a.length; for (int i = 0; i < N; i++) { int min = i; for (int j = i+1; j < N; j++) if (less(a[j], a[min])) min = j; show(a, i, min); exch(a, i, min); } } private static void show(double[] a, int i, int min) { StdDraw.setYscale(-a.length + i + 1, i); StdDraw.setPenColor(StdDraw.LIGHT_GRAY); for (int k = 0; k < i; k++) StdDraw.line(k, 0, k, a[k]*.6); StdDraw.setPenColor(StdDraw.BLACK); for (int k = i; k < a.length; k++) StdDraw.line(k, 0, k, a[k]*.6); StdDraw.setPenColor(StdDraw.BOOK_RED); StdDraw.line(min, 0, min, a[min]*.6); } private static boolean less(double v, double w) { return v < w; } private static void exch(double[] a, int i, int j) { double t = a[i]; a[i] = a[j]; a[j] = t; } public static void main(String[] args) { int N = Integer.parseInt(args[0]); StdDraw.setCanvasSize(260, 640); StdDraw.setXscale(-1, N+1); StdDraw.setPenRadius(.006); double[] a = new double ; for (int i = 0; i < N; i++) a[i] = StdRandom.uniform(); sort(a); } }
4.
相关文章推荐
- 《Android 应用》TextView追加文本并向下滚动
- 功能异常简单的贪吃蛇(队列实现)
- Oracle 并行操作
- AT&T汇编语言——工具及程序组成
- IT运维流程 — ITIL
- 【Mongo】Linux安装MongoDB
- ListView和Scrolloview共用View.measure(widthMeasureSpec, heightMeasureSpec) 空指针异常
- 在swift下 代码加载xib
- opencv:求视频的前n帧的融合图像
- 反射、注解与依赖注入总结
- mybatis与sql注入
- linux软件安装与卸载
- View的测量
- MFC Picture控件中截图
- OC中的单例模式
- turtlebot2+激光雷达
- 学习大数据第一天:IPython安装
- HDU 4081 Qin Shi Huang's National Road System [次小生成树]
- 浅析Yii2 GridView 日期格式化并实现日期可搜索教程
- How to migrate from VMware and Hyper-V to OpenStack