排序-5-希尔排序

来源:互联网 发布:神通数据库的英文 编辑:程序博客网 时间:2024/05/29 08:04

工具方法法类:

package myDataStructrueADNDalgorith.three.arrSort;/** * 数组为模板排序算法中的一些公用的模板方法 * 创建人:曹雪坤 * 时间:2017年3月12日-上午10:15:02  * @version 1.0.0 * */public class Example {    /*     * 交换数组中的两个数据     */    public static void exch(int [] arr,int i,int index){        int change = arr[i];        arr[i] = arr[index];        arr[index] = change;    }    /*     * 遍历数组     */    public static void show(int[] arr){        System.out.println("遍历数组");        for(int i:arr){            System.out.print("  "+i+"  ");        }        System.out.println();    }}

排序:

package myDataStructrueADNDalgorith.three.arrSort;/* * 希尔排序: *      有间隔的插入排序 */public class XiErSort {    public static void main(String[] args) {        int arr[] = {3,5,1,4,2,7,9,6,10,8,11,15,14,16,18,17,19,20,12,13,20,21,24,25,26,28,29,27,23};        XiErSort.sort(arr);    }    public static void sort(int[] arr){        int N = arr.length;        int h = 1;        //设置h的值就是间隔数位13 那么就是下标为0,13,26,组成一个新的数组        while(h < N/3){h = 3*h + 1;}        while(h >=1){//最后一次是h=1,就相当于进行一次插入排序,只不过大部分已经排序好了,所以很快            System.out.println("===h:"+h);            for(int i=h;i<N;i++){                for(int k=i;k>=h;k-=h){                    if(arr[k]>arr[k-h]){                        Example.exch(arr,k,k-h);                    }                    System.out.println("k: "+k+"====k-h:"+(k-h));                }            }            Example.show(arr);            h/=3;//增量序列        }    }}