希尔排序的实质就是分组插入排序,该方法又称缩小增量排序先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。步长的选择是希尔排序的重要部分。
注意:最终增量必须为1,相当于进行最后一次直接插入排序。
package demosort;
public class ShellSort {
/**
* 基本思想:算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,
* 每组中记录的下标相差d.对每组中全部元素进行直接插入排序
* 然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。
* 当增量减到1时,进行直接插入排序后,排序完成。
*/
public ShellSort(){
int a[]={1,54,6,3,78,34,12,45,56,100};
double d1=a.length;
int temp=0;
while(true){
d1= Math.ceil(d1/2);
int d=(int) d1;
for(int x=0;x<d;x++){
for(int i=x+d;i<a.length;i+=d){
int j=i-d;
temp=a[i];
for(;j>=0&&temp<a[j];j-=d){
a[j+d]=a[j];
}
a[j+d]=temp;
}
}
if(d==1)
break;
}
for(int i=0;i<a.length;i++)
System.out.print(a[i]+" ");
}
public static void main(String[] args) {
//实例化对象
ShellSort shell=new ShellSort();
}
}