思想:
希尔排序其实就是对直接插入排序的优化,给定一个数(gap)将待排序序列分为多个组进行排序,在gap>1都为预排序只为了能更趋于有序最后gap=1进行排序最终序列有序
为什么要分组是为了在大数据量时可以提高运行速度,那为什么要间隔着分组呢?
对比间隔分组和直接分组我们发现间隔分组可以使得大的数据更在后方,小的数据更在前方。
接着我们再缩小增量改为两组
最后我们再将gap设为1
这就是希尔排序,接下来我们根据这个思路来写代码:
public void shell(int[] array,int gap){
int n = array.length;
for (int i = gap; i < n; i++) {
int tmp = array[i];
int j = i - gap;
for (; j >= 0; j-=gap) {
if (array[j] > tmp) {
array[j + gap] = array[j];
} else {
break;
}
}
array[j + gap] = tmp;
}
}
public void shellSort(int[] array){
int gap = array.length;
while(gap>1){
shell(array,gap);//这里我们取gap为从数组长度开始每次/2
gap /= 2;
}
shell(array,1);
}
其中shell其实就是直接插入排序只不过是跨度都为gap。
希尔排序的时间复杂度:O(n^1.3~n^1.5)
空间复杂度:O(1)
稳定性:不稳定