1、原理
(1)希尔排序法又称缩小增量法。
(2)希尔排序法的基本思想是:先选定一个整数,将所有待排序元素分成若干个组,所有距离相同的元素分在同一组内,并对每一组内的元素进行排序。然后,重复上述分组和排序的工作。当到达组数为 1 时,所有记录在统一组内排好序。
(3)希尔排序是对直接插入排序的优化。
(4)当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,就整体而言,就可以达到优化的效果。
2、实现
(1)手动实现
(2)代码
public static void shellSort(int[] array){
//升序排序
//先对整个数组进行分组
int gap = array.length/2; //分成的组数是元素数出除2
if(gap>1){
insertSortGap(array,gap); //对每一组进行排序
gap/=2; //每次组数依次减少
}
insertSortGap(array,1); //组数为1时,对所有元素进行排序
}
private static void insertSortGap(int[] array, int gap) {
//还是和插入排序相同,通过 bound 来划分出两个区间
// [0, bound) 已排序区间
// [bound, size) 待排序区间
//若gap=1,此时就是插入排序
for(int bound = gap;bound<array.length;bound++){
int val = array[bound];
int cur = bound -gap; //cur位置是上一组的同一位置的元素
for(;cur >=0;cur-=gap){
if(array[cur]>val){//若为降序,条件改为(array[cur]<val)即可
array[cur+gap] = array[cur];
}else{
break;
}
}
array[cur+gap] = val;
}
}
(3)运行结果
3、性能分析
(1)时间复杂度
最好:O(n) (要排序的数据有序)
平均:O(n^1.3)
最坏:O(n^2) (要排序的数据比较难构造)
(2)空间复杂度:O(1)
(3)稳定性:不稳定