排序_希尔排序

希尔排序类似插入排序,但是希尔排序是有间隔的,从代码中可以明显对比看出。希尔排序有三个标记值,一个是标记着临时数据,需要插入正确位置的数据,其每一次循环初始值都是outer指向的数值。另外两个是标记着需要比较的两个对象,outer和innner,outer的初始值是h,innner的初始值跟outer一样,跟插入不同的是innner的指针的移动是每隔h个往前移动,根据这个法则,只有当inner等于h时,才能进行最后一次的循环比较,所以innner〉h-1
希尔排序的最外层循环跟插入排序不同,插入排序是outter来决定的,希尔排序是由间隔数决定的。

public class ArraySh {
    private long [] a;
    private int nElems;
    public ArraySh(int maxSize) {
        a=new long[maxSize];
        nElems=0;
    }
    //插入
    public void insert(long value) {
        a[nElems++]=value;
    }
    //显示
    public void display() {
        for(int j=0;j<nElems;j++)
            System.out.print(a[j]+" ");
        System.out.println();
    }
    //排序
    public void shellSort() {
        int inner,outer;
        long temp;
        int h=1;//间隔(通过计算)
        while(h<=nElems/3)
            h=h*3+1;//h由nElems来决定,循环过后,h的值就是真实的初始值
        
        //h的改变,h的值来确定循环的次数
        while(h>0) {//希尔排序与插入排序对比,多了一层外面的h循环
            //每次循环outer的值是0+h
            for(outer=h;outer<nElems;outer++) {
                temp=a[outer];
                inner=outer;
                //反着想,每隔h个,outer前面的数据都会是有序的,所以innner指向的数据不能是下标为h-1的数据的前面,不会对这个前面的数据进行比较
                while(inner>h-1&&a[inner-h]>=temp) {
                    a[inner]=a[inner-h];
                    inner-=h;
                    
                }
                a[inner]=temp;
            }
            h=(h-1)/3;
        }
            
        
        
        
        
        
    }



}
public class Test {

    public static void main(String[] args) {
        int maxSize=100;
        ArraySh array=new ArraySh(maxSize);
        array.insert(77);
        array.insert(99);
        array.insert(44);
        array.insert(55);
        array.insert(22);
        array.insert(88);
        array.insert(11);
        array.insert(0);
        array.insert(66);
        array.insert(33);
        array.display();
        array.shellSort();
        array.display();

    }

}
原文地址:https://www.cnblogs.com/S-Mustard/p/8097451.html