希尔排序为有间隔序列的插入排序
不宜在链式存储中使用
经验得出时间复杂度:O(n^1.25)-O(1.6n^1.25)
将待排序数组按照一定的间隔分为多个子数组,每组分别进行插入排序。这里按照间隔分组指的不是取连续的一段数组,而是每跳跃一定间隔取一个值组成一组
逐渐缩小间隔进行下一轮排序
最后一轮时,取间隔为 1,也就相当于直接使用插入排序。但这时经过前面的「宏观调控」,数组已经基本有序了,所以此时的插入排序只需进行少量交换便可完成
public void shellSort(int[] nums){
//间隔序列,在希尔排序中我们称之为增量序列
for(int gap=nums.length/2;gap>0;gap/=2){
//插入排序
//从gap开始,按照顺序将每个元素依次向前插入自己所在的组
for(int i=gap;i<nums.length;i++){
//cur站起来,开始找位置
int cur=nums[i];
//该组前一个数字的索引
int j=i-gap;
while(j>=0 && nums[j]>=cur){
nums[j+gap]=nums[j];
j-=gap;
}
//cur插入找到了自己的位置,坐下
nums[j+gap]=cur;
}
}
}