原理
希尔排序是一种插入排序的优化,将一个完整的数组分成若干组,进行插入排序,分组不断变小,排序的效率也会不断提高;动画演示
思路讲解
- 引入一个gap表示分组数,gap的初始值为array.length/2,然后分别对两组数据进行插入排序;
- gap每次都为上一次的二分之一,最终当gap为1的时候,对整体在进行一次插入排序;
代码实现
代码如下:
import java.util.Arrays;
public class Test {
public static void shellSort(int[] array){
int gap = array.length/2;
while (gap > 1){
insertSortGap(array,gap);
gap = gap/2;
}
insertSortGap(array,1);
}
private static void insertSortGap(int[] array, int gap) {
for (int bound = gap; bound < array.length; bound++) {
int tmp = array[bound];
int cur = bound-gap;
for (; cur >= 0; cur -= gap) {
if (array[cur] > tmp){
array[cur+gap] = array[cur];
}else {
break;
}
}
array[cur+gap] = tmp;
}
}
public static void main(String[] args) {
int[] array = {9,5,2,7,3,6,8};
shellSort(array);
System.out.println(Arrays.toString(array));
}
}
运行结果:
效率分析
稳定性
不稳定
时间复杂度
极限值为O(n^1.3)
空间复杂度
O(1)