希尔排序

希尔排序

希尔排序是升级版的插入排序,也叫缩小增量排序。
时间复杂度是O(nlog2n),是不稳定的算法

1.如何确定增量

这里就用最简单的增量减半

2.代码如下:

public static void shellSort(int[] array){
        int step = array.length;
        //记录每个组里的第一个元素的下标
        int i;
        //遍历时记录组里元素的下标
        int j;
        //保存将要插入的那个值的(不是下标了)
        int tem;
        //保存插入时要比较的元素的下标
        int k;
        // 如何计算增量(增量同时也是组数)
        while((step = step / 2) > 0){
        //某个增量具有的组数,分别对不同组进行插入排序,搭配初始化时的变量解释看,这里step有多大,就有多少组需要进行插入排序
            for(i = 0 ; i < step ; i++){
            //这里开始插入排序,与一般的插入排序无异,只是原来的插入排序是变化1来进行比较插入,这里是变化step来进行比较插入
                for(j = i + step ; j < array.length ; j = j + step){
                //发现那个元素小于待插入元素时
                    if(array[j] < array[j - step]){
                        tem = array[j];
                        k = j - step;
                        //这里必须先写k>=0,因为k可能是负值,先写后边的可能会数组越界
                        //循环插入比较,直到遇到比待插入值大的数字
                        while(k >= 0 && tem < array[k]){
                            array[k + step] = array[k];
                            k = k - step;
                        }
                        //k是不满足上诉while循环的条件,所以k+step才是正确的插入位置,搞定。
                        array[k + step] = tem;
                    }
                }
            }
        }
    }

代码:

public class ShellSort {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

    }
    
    
    public static void shellSort(int[] array){
        int step = array.length;
        int i;
        int j;
        int tem;
        int k;
        while((step = step / 2) > 0){// how much step
            for(i = 0 ; i < step ; i++){//one step has step's group
                for(j = i + step ; j < array.length ; j = j + step){
                    if(array[j] < array[j - step]){
                        tem = array[j];
                        k = j - step;
                        while(k >= 0 && tem < array[k]){
                            array[k + step] = array[k];
                            k = k - step;
                        }
                        array[k + step] = tem;
                    }
                }
            }
        }
    }
    

    private static void print(int[] array){
        for(int i : array){
            System.out.print(i + " ");
        }
        System.out.println("");
    }

}


你可能感兴趣的:(希尔排序)