算法学习记录-希尔排序

针对快速排序的优化,原理在快速排序前针对使数组内任意间隔为H的字数组是有序的,当H变化为1时直接为快速排序,大概的代码描述如下:

public class ShellSort {

    public static void sort(int[] a)
    {
        int N = a.length;
        int H = 1;
        while(H< 3/N)
        {
            H = 3*H+1;
        }
        
        while(H >= 1)
        {
            for (int i = H; i<N;i++) {
                for (int j = i; j > 0 && (a[j]<a[j-H]); j = j-H) {
                    swap(a[i], a[i-H]);
                }
            }
            H = H/3;
        }

    }

}

希尔排序的高效原因在于平衡了子数组的规模和有序性,希尔排序的时间复杂度与增量序列的选取有关,例如希尔增量时间复杂度为O(n²),而Hibbard增量的希尔排序的时间复杂度为O(

),希尔排序时间复杂度的下界是n*log2n。希尔排序没有快速排序算法快 O(n(logn)),因此中等大小规模表现良好,对规模非常大的数据排序不是最优选择。

算法效率取决于H 和H的变化因子,这个目前貌似没有定论,需要数学来论证。


阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

算法学习记录-希尔排序

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭