希尔排序和上文中的直接插入一样,都是插入排序的一种。之前直接插入排序的缺点是假如小数在靠后的位置,则其前面的数都要前提,希尔排序则是先取步长,这样可以减少移动的次数。
希尔排序的准则就是“先取步长,再分小组;以组为准,组内排序”。基本代码如下:
public static void shellSort(int[]arr){
for(int d=arr.length/2;d>0;d/=2){ //遍历所有步长
for(int i=d;i<arr.length;i++){ //遍历所有元素
for(int j=i-d;j>=0;j-=d){ //遍历本组元素
if(arr[j]>arr[j+d]){
if(arr[j]>arr[j+d]){
int temp=arr[j];
arr[j]=arr[j+d];
arr[j+d]=temp;
}
}
}
}
}
}
优点是可以将右边小数和左边大数快速移动到相应位置。