初级排序算法(选择排序+插入排序+希尔排序)动态可视化实现
来源:互联网 发布:邮箱数据购买 编辑:程序博客网 时间:2024/04/30 07:57
本文调试运行环境另见:点击打开链接
一、选择排序
1.排序过程
以升序为例,首先,找到数组中最小的元素,其次,将它和数组的第一个元素交换位置。再在剩下的元素中找到最小的元素,将它与数组第二个元素交换位置。如此往复,直到数组有序。
2.具体实现
import edu.princeton.cs.algs4.StdDraw;import edu.princeton.cs.algs4.StdOut;/* * 模板类,声明了排序过程中常用的方法 * */public class Template {protected static boolean less(double v,double w){ //比较两个元素的大小return (v - w) < 0;}protected static void exch(double[] a,int i,int j){ //交换两个元素的位置double t = a[i];a[i] = a[j];a[j] = t;}protected static void show(double[] a){ //以柱状图的形式显示排序过程int N = a.length;for(int i = 0;i < N;i++ ){double x = 1.0 * i / N;double y = a[i] / 2.0;double rw = 0.5 / N;double rh = a[i] / 2.0;StdDraw.filledRectangle(x, y, rw, rh);}StdDraw.enableDoubleBuffering(); //启用双缓冲。所有的后续调用绘图方法如line(),circle()和square()将延期到下一个show()的调用。}}
import edu.princeton.cs.algs4.StdDraw;public class SelectionSort extends Template { //选择排序算法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])) //调用模板类中less()方法min = j;}exch(a,i,min); //调用模板类中exch()方法show(a); //调用模板类中show()方法StdDraw.show();StdDraw.clear();}}}
3.特点总结
1)选择排序运行时间和输入无关。为了找出剩余元素中最小的元素,每次循环都会扫描一遍剩余元素,切上次扫描过程并不能为下一次扫描提供帮助。
2)数据移动是最少的。每次交换都会改变两个数组元素的值,所以选择排序交换次数和数组长度N成正比。
二、插入排序
1.排序过程
以升序为例,每次内循环都会将当前索引对应元素值和之前元素比较,若小则前移,每次内循环完成后索引后移以为直到索引指向数组最后一位。
2.具体实现
public class InsertionSort extends Template {public static void sort(double[] a){int N = a.length;for(int i = 1;i < N;i++){for(int j = i;j > 0 && less(a[j],a[j-1]);j--){exch(a,j,j-1);//show(a);//StdDraw.show();//StdDraw.clear();}}}}3.特点总结
当前索引左侧所有元素有序,但最终位置不确定;与选择排序不同的是插入排序所需时间取决于输入中元素的初始顺序,对一个初始部分有序的数组进行插入排序比对一个初始随机无序的数组进行排序要快很多。
三、希尔排序
1.排序过程
希尔排序是一种基于插入排序的快速排序算法。希尔排序是使数组中任意间隔为h的元素都是有序的,这样的数组被称为h有序数组。再逐渐缩小h,直到h为1。
2.具体实现
public class ShellSort extends Template{public static void sort(double[] a){int N = a.length;int h = 1;while(h < N/3) h = 3 * h +1;while(h >= 1){for(int i = h;i < N;i++){for(int j = i;j >= h && less(a[j],a[j-h]);j -= h){exch(a,j,j-h);show(a);StdDraw.show();StdDraw.clear();}}h = h / 3;}}}public class SortCompare { public static void select(String alg,double[] a){ //测试不同排序方法if(alg.equals("Insertion")) InsertionSort.sort(a);if(alg.equals("Selection")) SelectionSort.sort(a);if(alg.equals("ShellSort")) ShellSort.sort(a);}public static void selectRandomInput(String alg,int N){ //使用算法alg对长度为N的数组排序double[] a = new double[N];for(int i = 0;i < N;i++){a[i] = StdRandom.uniform();}select(alg,a);} public static void main(String[] args) {String alg1 = "Insertion";String alg2 = "Selection"; String alg3 = "ShellSort"; int N = 100;// selectRandomInput(alg1, N);selectRandomInput(alg2, N); selectRandomInput(alg3, N); }1 0
- 初级排序算法(选择排序+插入排序+希尔排序)动态可视化实现
- 初级排序算法(选择排序、插入排序、希尔排序)
- 五、排序算法(选择排序、插入排序、希尔排序)
- 初级排序-选择排序、插入排序、希尔排序总结
- Java实现选择排序、插入排序、希尔排序算法
- 常见比较排序算法的实现(归并排序、快速排序、堆排序、选择排序、插入排序、希尔排序)
- 算法系列(二)冒泡排序、选择排序、插入排序和希尔排序(Java实现)
- 初级排序算法之冒泡、选择、插入、希尔排序(附Java实现和分析)
- 【算法】排序 (一):插入排序&希尔排序&选择排序&堆排序(C++实现)
- Java实现八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序等
- java实现排序算法之插入排序(直接插入排序,折半插入排序,希尔排序)
- 排序算法(1):插入排序,选择排序,希尔排序,堆排序
- 几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- C#实现排序(冒泡排序,选择排序,插入排序,希尔排序)
- 常用的排序算法:插入排序,希尔排序,冒泡排序,选择排序,快速排序,归并排序
- 基本排序算法(选择、插入、冒泡)和希尔排序
- 插入排序 希尔排序 选择排序 归并排序 堆排序的算法实现,献给面试排序算法的同学们
- 初级排序算法(选择、插入、Shell)
- 如何获取电池状态
- 配色方案
- linux centos 虚拟机 设置网络连接方式为nat
- python yield generator 详解
- CentOS7上安装Redis3.2.8
- 初级排序算法(选择排序+插入排序+希尔排序)动态可视化实现
- gunicorn syncworker 源码解析
- 深入理解JavaScript系列(23):JavaScript与DOM(上)——也适用于新手
- C++类型萃取
- 计算机网络体系结构
- 发布系统报错,SpringObjectFactory.java:220:-1,解决方法
- 作业题(dp)
- gunicorn 信号处理(SIGHUP,SIGUSR2)
- Java网络架构前言