原理
希尔排序的思想是,先将原有数据按照一定的 gap(间隔)分开,分成多个组,每一组内进行排序(直接插入排序),接着将 gap 缩小,重复上述分组排序工作,直到 gap==1 为止,gap 是没有规定的,但我们一般选择数组长度的一半。希尔排序是对直接插入排序的一个优化,当 gap=1 时,数组接近于有序,再进行排序就高效多了
比如:
实现
public static void shellSort(int[] arr){
int gap = arr.length/2;
while(gap>=1){
insertSortGap(arr,gap);
gap = gap/2;
}
}
//按照插排对分组的数据进行排序
public static void insertSortGap(int[] arr,int gap){
for(int i = gap;i < arr.length;i++){
int key = arr[i];
int j = i - gap;
for(;j>=0&&arr[j]>key;j-=gap){
arr[j+gap] = arr[j];
}
arr[j+gap] = key;
}
复杂度
稳定性
不稳定