排序算法-插入排序之希尔排序

希尔排序是插入排序的一种。
首先我们来了解一个定理:交换相邻元素的任何排序算法平均时间为O(N^2)。
所以希尔排序通过比较一定间隔的元素来进行工作,各趟距离随算法减小,最后比较相邻元素完成排序。也就是说原来的插入排序是相邻的元素比较,而希尔排序是具有间隔的插入排序,这个间隔就是这个序列。
希尔排序使用增量序列:h1,h2,h3…ht;h1=1。使得每趟排序使数组a[i]<=a[i+hk]。最后一趟使a[i]<=a[i+1]。希尔排序也叫缩减增量排序。
这里写图片描述
增量序列一个流行的序列是Shell(算法创造人)建议建议的,ht=N/2,向下取整,hk=h(k+1)/2,向下取整,一直取到1为止。例如该数组有10个元素,那么序列为:5,2,1。(不要被上面那个图片误导)
代码

public class ShellSort {

    @Test
    public void test(){
        Integer[] array = new Integer[]{10,54,55,47,50,20,41,33,40,70};
        sort(array);
        for(int i = 0; i < array.length; i++){
            System.out.print(array[i]+" ");
        }
        System.out.println();
    }

    public static <T extends Comparable<? super T>> void sort(T[] array){
        int length = array.length;
        T temp = null;
        for(int i = length/2; i >= 1; i /= 2){
            for(int x = i; x < length; x++){
                for(int y = x - i; y >= 0; y -= i){
                    if(array[y].compareTo(array[y+i]) > 0){
                        temp = array[y];
                        array[y] = array[y+i];
                        array[y+i] = temp;
                    }else {
                        break;
                    }
                }
            }
        }
    }
}

希尔排序最好的时间复杂度为O(N),平均为O(N^3/2),最差为O(N^2)。但这一切取决于增量序列,希尔增量序列的时间复杂度最差为O(N^2),Hibbard序列最差的时间复杂度为O(N^3/2)。适合小规模数据。
Hibbard增量序列:{1, 3, …, 2^k-1}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值