您的位置:首页 > 其它

希尔排序

2016-07-10 16:58 453 查看
希尔排序
1.      希尔排序的产生:

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

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

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

3.      希尔排序的优点

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

4.      间隔的计算:

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

5.      间隔的减少:

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

 

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

希尔排序的实现:

/*
 * 希尔排序
 */
public
class
ShellSort {
    /**
     * 排序方法
     */
    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
class
TestShellSort {
    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讲快速排序
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  希尔排序