初级排序算法(选择排序+插入排序+希尔排序)动态可视化实现

来源:互联网 发布:邮箱数据购买 编辑:程序博客网 时间: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
原创粉丝点击