希尔排序算法本质上来说是直接插入排序算法的升级版,当数组元素大多数有序的情况下,插入排序的工作量较小,因此可以先对数组进行“预处理”,继而再进行直接插入排序,会效率得多。详见某大佬的图解希尔排序:
https://www.sohu.com/a/341037266_115128
以下是实现代码:
public static void ShellSort(int[] array){
int length = array.length;
//设置增量,并且逐步缩小
for(int gap = length/2 ; gap> 0 ; gap/=2){
//从第gap个元素开始,逐个对其所在组进行直接插入排序
for(int i = gap ; i < array.length ; ++i){
int currentIndex = i;
int value = array[currentIndex];
if(array[currentIndex]<array[currentIndex-gap]){
while(currentIndex - gap >=0 && array[currentIndex-gap]>value){
array[currentIndex] = array[currentIndex-gap];
currentIndex-=gap;
}
//当退出循环后
array[currentIndex] = value;
}
}
}
}