1. 程式人生 > >希爾排序(Shell Sort)

希爾排序(Shell Sort)

 /**
     * 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); }