1、基本概念
希尔排序是基于直插排序,也称为缩小增量排序。
把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
2、实现
public static void main(String[] args) {
int[] src = { 3,2,1,4,5,6,7,16,15,14,13,12,11,10,8,9 };
shellSort(src);
print(src);
}
public static void shellSort(int[] list) {
int gap = list.length / 2;
while (1 <= gap) {
for (int i = gap; i < list.length; i++) {
int j = 0;
int temp = list[i];
// 对距离为 gap 的元素组进行直插排序
for (j = i - gap; j>=0 && temp<list[j]; j = j - gap)
list[j + gap] = list[j];
list[j + gap] = temp;
}
gap = gap / 2; // 减小增量
}
}
public static void print(int src[]){
for (int i = 0; i < src.length; i++) {
System.out.print(src[i] + " ");
}
System.out.println();
}
3、复杂度
希尔排序是当时第一个复杂度突破O(
n2
)的。希尔排序的关键是增量的选择。
平均时间 O(nlogn)
最坏情况 O(
ns
) (1
<
s
<
2)