如何使用经验派生的增量进行shell排序?

时间:2016-05-08 16:40:56

标签: java algorithm shellsort

根据Wikipedia文章,我试图用经验派生的增量实现Shell排序来执行h-sort:

1,4,10,23,57,132,301,701

目前,我正在使用h = 3*h + 1来执行排序,这是我的实现:

    public class Solution
{
    private static final int arr[] = {9,4,5,1,2,8,7,6,12,45,21,34,1,2,3};
    public static void main(String[] args)
    {
        int N = arr.length;
        int h = 1;
        while(h<N/3)
            h = 3*h + 1;
        while(h>=1)
        {
            for(int i=h;i<N;i++)
            {
                for(int j=i;j>=h && arr[j-h]>arr[j];j-=h)
                {
                    int temp = arr[j-h];
                    arr[j-h] = arr[j];
                    arr[j] = temp;
                }
            }
            h/=3;
        }

        for(int x:arr)
            System.out.println(x);

    }
}

现在,这可以很好地完成任务。但问题是,如果我通过使用经验派生的序列来执行shell排序来执行h排序,我应该如何根据数组的大小选择必须使用的增量?

1 个答案:

答案 0 :(得分:1)

将经验派生的序列存储在数组中,并找到此数组的最后一个小于数据数组大小的元素。

例如,如果数据大小为500,则必须先获得301作为第一步