希尔排序(java实现)

    上篇blog中介绍的直接插入排序,希尔排序就是对直接插入排序的一个优化。好比有这么一种状况:对一个无序数组进行从小到大的排序,可是数组的最后一个位置的数是最小的,咱们要把它挪到第一个位置,其余位置的都要日后移动,要是这个数组很是大,那么直接插入排序的开销就很是大。java

    如今有一个array,希尔排序就是设定一个增量incrementNum(0<incrementNum<array.length)。数组

    先从array[0]开始,以incrementNum为增量的进行直接插入排序,直到数组末尾,而后从array[1]开始重复:以incrementNum为增量的进行直接插入排序; 而后从array[1]开始重复......一直到array[n]。优化

    而后取一个小于上一步增量的新的增量(好比设置为incrementNum/2),对前一个步骤的结果array进行遍历,直接插入排序....spa

    再取小于上一步增量的新的增量,重复进行:遍历,直接插入排序code

    直到新的增量小于1以后再退出循环blog

    步骤1:好比如今有数组{82 ,31 ,29 ,71, 72, 42, 64, 5,110}   第一次取增量设置为array.length/2 = 4    先从82开始以4为增量遍历直到末尾,获得(82,42) 排序获得{42 ,31 ,29 ,71, 72, 82, 64, 5,110}。 而后从第二个数31开始重复上一个步骤,获得(31,64) 排序获得{42 ,31 ,29 ,71, 72, 82, 64, 5,110}.......   以4为增量的遍历完数组以后,获得的结果是{42 ,31,5,71,72,82,64,29,110}排序

   而后从新区增量,这儿设定为incrementNum/2 = 2,对{42 ,31,5,71,72,82,64,29,110}重复步骤1。  完事以后,在取新的增量,重复步骤1。 直到取到的增量小于1,退出循环。rem

   java实现代码以下:class

   

    /**
     * 希尔排序
     * @param arrays 须要排序的序列
     */
    public static void sort(int[] arrays){
        if(arrays == null || arrays.length <= 1){
            return;
        }
        //增量
        int incrementNum = arrays.length/2;
        while(incrementNum >=1){
            for(int i=0;i<arrays.length;i++){
                //进行插入排序
                for(int j=i;j<arrays.length-incrementNum;j=j+incrementNum){
                    if(arrays[j]>arrays[j+incrementNum]){
                        int temple = arrays[j];
                        arrays[j] = arrays[j+incrementNum];
                        arrays[j+incrementNum] = temple;
                    }
                }
            }
            //设置新的增量
            incrementNum = incrementNum/2;
        }
    }
相关文章
相关标签/搜索