希爾排序(Shell Sort)
阿新 • • 發佈:2018-12-24
/**
* 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);
}