思路
希尔排序是插入排序的升级版,给定一个k的序列,比如1, 4, 13。那么先使用插入排序的思想,使数组每隔13个数有序,如:
- a1, a14, a27...有序
- a2, a15, a28...有序
- ...
然后重新使用插入排序的思想,使数组每隔4个数有序,最后当k为1时,整个数组有序。
复杂度
- 时间复杂度:取决于k的增量序列选取方式,n1.3, 最坏n2, 最好n*log2n
- 空间复杂度:1
代码
/**
* 希尔排序
*/
public class ShellSort {
public static <T extends Comparable> void sort(T[] arr) {
int n = arr.length;
int k = 1;
while (k < n / 3) k = 3 * n + 1; //1, 4, 13, 40...
while (k >= 1){
// 将数组变成k有序
for (int i = k; i < n; i += k) {
for (int j = i; j > 0 && arr[j].compareTo(arr[j - k]) < 0; j -= k) {
T temp = arr[j];
arr[j] = arr[j - k];
arr[j - k] = temp;
}
}
k /= 3;
}
}
}
关于
一般情况下,希尔排序性能优于直接插入排序。但弱于快排。一般使用较少。