/**
* 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);
}
希尔排序(Shell Sort)
最新推荐文章于 2020-07-11 10:18:05 发布