希尔排序

来源:互联网 发布:淘宝大促 编辑:程序博客网 时间:2024/06/13 23:29

希尔排序

1.      希尔排序的产生:

希尔排序基于插入排序,添加了一些新特性,从而提高插入排序的执行效率。

2.      插入排序的缺陷:多次移动

假如一个很小的数据在靠右端的位置上,那么要将该数据排序到正确的位置上,则所有的中间数据都要向右移动一位。

3.      希尔排序的优点

希尔排序通过加大插入排序中元素之间的间隔,并对这些间隔的元素进行插入排序,从而使得数据可以大幅度的移动。当完成该间隔的排序后,希尔排序会减少数据的间隔进行排序。依次进行下去。

4.      间隔的计算:

间隔h的初始值为1,通过h=3*h+1来循环计算,直到该间隔大于数组的大小时停止。最大间隔为不大于数组大小的最大值。

5.      间隔的减少:

可以通过公司h=(h-1)/3来计算。

 

特点:右侧不会有太多太大的数据。

希尔排序的实现:

/*

 * 希尔排序

 */

public classShellSort {

    /**

     * 排序方法

     */

    public static void sort(long[] arr) {

        //初始化一个间隔

        int h = 1;

        //计算最大间隔

        while(h < arr.length / 3) {

            h= h * 3 + 1;

        }

       

        while(h > 0) {

            //进行插入排序

            long tmp = 0;

            for(int i = h; i < arr.length; i++) {

                tmp= arr[i];

                int j = i;

                while(j > h - 1 &&arr[j - h] >= tmp) {

                    arr[j]= arr[j - h];

                    j-= h;

                }

                arr[j]= tmp;

            }

            //减小间隔

            h= (h - 1) / 3;

        }

    }

}

 

public classTestShellSort {

    public static void main(String[] args) {

        long[] arr =new long[10];

        arr[0]= 90;

        arr[1]= 12;

        arr[2]= 23;

        arr[3]= 15;

        arr[4]= -4;

        arr[5]= 1;

        arr[6]= 97;

        arr[7]= 4;

        arr[8]= 3;

        arr[9]= 8;

       

        System.out.print("[");

        for(long num : arr) {

            System.out.print(num +" ");

        }

        System.out.print("]");

        System.out.println();

       

        ShellSort.sort(arr);

       

        System.out.print("[");

        for(long num : arr) {

            System.out.print(num +" ");

        }

        System.out.print("]");

        System.out.println();

       

    }

}

运行结果:

[90 12 23 15 -4 1 97 4 3 8 ]

[-4 1 3 4 8 12 15 23 90 97 ]

 

第9讲快速排序

0 0
原创粉丝点击