希尔排序(Shell Sort)

来源:互联网 发布:软件出售 编辑:程序博客网 时间:2024/06/07 02:21
 /**     * 3.3 希尔排序: 先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组;     * 所有距离为d1的倍数的记录放在同一个组中,先在各组内进行直接插入排序;     * 取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1);     * 即所有记录放在同一组中进行直接插入排序为止,该方法实质上是一种分组插入方法.     *      * EX: int[] nums={8,1,4,2,23,10}; <     *      * d=length/2=3    8,1,4,2,23,10     *                 |     |          *                 2,1,4,8,23,10     *                          *                 2,1,4,8,23,10     *                   |     |        *                 2,1,4,8,23,10     *                      *                 2,1,4,8,23,10     *                     |      |        *                 2,1,4,8,23,10     *                              *      d=d/2=1    2,1,4,8,23,10     *                 | | | | |  |     *                 1,2,4,8,10,23     *                      * 希尔排序是不稳定的.     * 希尔排序的时间性能优于直接插入排序.     * 希尔排序的平均时间复杂度为O(nlogn).     *      */    public static void shellSort(int[] nums) {        int d=nums.length;        int insert;        do{            d/=2;            for(int i=0;i<d;i++){                for(int j=i+d;j<nums.length;j=j+d){                    if(nums[j]<nums[j-d]){                        insert=nums[j];                        for(int k=j-d;k>=0;k=k-d){                            nums[k+d]=nums[k];                            if(k==i){                                nums[i]=insert;                            }                            else if(insert>=nums[k-d]){                                nums[k]=insert;                                break;                            }                        }                    }                }            }        }while(d!=1);    }
0 0
原创粉丝点击