排序算法-------希尔排序(ShellSort)

public class ShellSort {
    /**
     * 希尔排序
     *  步长的确定该是一个问题,影响最终效率。
     * Shell 排序 第一个突破时间复杂度为O2的算法,  非稳定排序算法
     * 算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,
     * 每组中记录的下标相差d.对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,
     * 在每组中再进行直接插入排序。当增量减到1时,进行直接插入排序后,排序完成
     * @param args
     */
    public static void shellSort(int[] arr) {
        if(arr==null||arr.length==0) {
            return ;
        }
        int temp = 0;
        int step = arr.length;//步长


        while(true) {
            step = step/2;
            for(int i=0;i<step;i++) {//前半部分
                for(int j = i+step;j<arr.length;j+=step) {//后半部分
                    int k = j;//记录下当前的 j 的位置
                    temp = arr[j];//当前位置的值
                    for(k-=step;k>=0&&arr[k]>temp;k-=step) {//前半部分, 如果前面的值大于后面的值,则交换
                        arr[k+step] = arr[k];//把较大值放后头
                    }
                    //上一个循环结束时,k会减去一个步长,因此,这里要加回一个步长才能得到前半部分的索引值index
                    arr[k+step] = temp;//较小值放前面
                }
            }
            if(step == 1) {
                break;
            }
        }
    }

    public static void main(String[] args) {
        int[] arr={49,38,65,1,97,76,13,27,42,78,34,12,64,1};
        shellSort(arr);
        for (int i : arr) {
            System.out.println(i);
        }


    }

}

猜你喜欢

转载自blog.csdn.net/weixin_42061676/article/details/81093106
今日推荐