希尔排序是对插入排序的一种改进,要想理解希尔排序必须先理解插入排序,希尔排序与插入排序的区别就是,希尔排序每次移动指针的距离不是固定每次只移动一个单位距离。可以想象一下,假设有一万个数据来排序,前9999个都已经排好了发现第10000个数据值相当小,如果它刚好是这个数据的最小值的话,他们它将会跟它前面的9999个数据依次的比较,然后再慢慢的移动,最后再排到第一个,这10000个数据还算少的,假如更多呢?计算机遇到这种情况,只能按照特定的算法愚蠢的执行,所以说插入法是一个不稳定的算法,而希尔排序就是对插入法的一种改进,是一个稳定的排序算法,希尔排序不要求一趟就把所有顺序都排好而是分很多趟完成的。它第一趟排序过程中指针一次移动的距离可以很大,然后到第二趟,第三趟....再慢慢缩短指针一次移动的距离,这样就可以保证,整个数列整体上是一个相对比较顺序的数列,只是局部顺序是乱的,这样就不会出现插入法那种到后面一个值要移动很远的距离的情况了。至于指针一次移动多少距离,是有一个固定的公式来计算的,代码如下:
public static void sort(int[] arr){
int h=1;
//初始化间隔,确定初始的移动距离
while(h<arr.length/3){
h=h*3+1;
}
while(h>=1){
for(int i=h;i<arr.length;i++){
int t=arr[i];
int j=i-h;
while(j>=h-1&&arr[j]>t){
arr[j+h]=arr[j];
j-=h;
}
arr[j+h]=t;
}
h=(h-1)/3;//每完成一趟排序,按照公式缩短移动距离
}
}