希尔排序是加强版的插入排序,相对与普通的插入排序做了优化,比普通的插入排序多了一个步长的概念
就是把数据下标按照一定的步长进行分组,然后每组分别用普通插入排序进行排序,知道步长减至为 1 时,算法终止。
算法名称 | 平均时间复杂度 | 最好情况 | 最坏情况 | 空间复杂度 | 稳定性 |
---|---|---|---|---|---|
希尔排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(1) | 不稳定 |
/**
* @author shengjk1
* @date 2020/4/9
*/
public class ShellSort {
public static void main(String[] args) {
int[] arr = {1, -2, 2, -3, 5, 0};
for (int gap = arr.length / 2; gap > 0; gap /= 2) {
for (int j = gap; j < arr.length; j += gap) {
int insertIndex = j;
int insertValue = arr[insertIndex];
while (insertIndex - gap >= 0 && arr[insertIndex - gap] > insertValue) {
arr[insertIndex] = arr[insertIndex - gap];
insertIndex -= gap;
}
arr[insertIndex] = insertValue;
System.out.printf("第%d次遍历 insertIndex %d arr:%s", j, insertIndex, Arrays.toString(arr));
System.out.println();
}
}
}
}
代码基本与普通插入排序一致。