希尔排序的实质:跳着插。其中增量
基本思想:将整个待排序元素分割成若干个子序列(由相隔某个“增量”的元素组成)分别进行直接插入排序,然后依次缩小增量再进行排序,待整个序列中的元素基本有序(增量足够小),再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率使很高的,因此希尔排序在时间效率上比前两种方法(直接插入排序,折半插入排序)有较大的提高
案例模拟:
以n=10的一个数组49, 38, 65, 97, 26, 13, 27, 49, 55, 4为例
其中
(1) gap = 10/2 = 5
49 38 65 97 26 13 27 49 55 4(按颜色分类,相同颜色标记的进行排序)
第一趟结果===> 13 27 49 55 4 49 38 65 97 26
(2) gap = gap/2 =5/2=2
13 27 49 55 4 49 38 65 97 26
第二趟结果===> 4 26 13 27 38 49 49 55 97 65
(3) gap = gap/2 = 2/2 = 1
4 26 13 27 38 49 49 55 97 65
第三趟结果===> 4 13 26 27 38 49 49 55 65 97
(4)gap = gap/2 = 1/2 = 0
排序完成得到 4 13 26 27 38 49 49 55 65 97
java代码实现:
public void shellOrder(int[] arr){
for(int gap=arr.length/2;gap>0;gap/=2){
//从数组第gap个元素开始
for(int j=gap;j<arr.length;j++){
if(arr[j]<arr[j-gap]){
//每个元素与自己组内的数据进行直接插入排序
int temp = arr[j];
int k = j-gap;
while(k>=0 && arr[k]>temp){
arr[k+gap] = arr[k];
k-=gap;
}
arr[k+gap] = temp;//插入元素
}
}
}
}
注意:希尔排序的步长选择都是从len/2开始,每次再减半,直到最后为1.其实可以有另外的更高效的步长选择。读者可以去了解更多。