希尔排序(shell sort)这个排序方法又称为缩小增量排序,是1959年D·L·Shell提出来的。该方法的基本思想是:设待排序元素序列有n个元素,首先取一个整数increment(小于n)作为间隔将全部元素分为increment个子序列,所有距离为increment的元素放在同一个子序列中,在每一个子序列中分别实行直接插入排序。然后缩小间隔increment,重复上述子序列划分和排序工作。直到最后取increment=1,将所有元素放在同一个子序列中排序为止。
由于开始时,increment的取值较大,每个子序列中的元素较少,排序速度较快,到排序后期increment取值逐渐变小,子序列中元素个数逐渐增多,但由于前面工作的基础,大多数元素已经基本有序,所以排序速度仍然很快。
代码
public class ShellSort {
public static void main(String[] args){
Comparable[] a = {'s','h','e','l','l','s','o','r','t','e','x','a','m','p','l','e'};
sort(a);
show(a);
}
public static void sort(Comparable[] a){
// 将a[]按升序排序
int N = a.length;
int h = 1;
while (h < N/3) h = 3*h + 1;
while (h >= 1){
// 将数组变为h有序
for (int i = h;i < N;i++){
// 将a[i]插入到a[i-h],a[i-2*h],a[i-3*h].. 之中
for (int j = i; j >= h && less(a[j], a[j-h]); j -=h){
exch(a, j, j-h);
}
}
h = h/3;
}
}
// 元素比较大小
private static boolean less(Comparable v, Comparable w){
return v.compareTo(w) < 0;
}
// 将元素交换位置
private static void exch(Comparable[] a,int i,int j){
Comparable t = a[i];
a[i] = a[j];
a[j] = t;
}
// 输出数组
private static void show(Comparable[] a){
for (int i=0;i < a.length;i++)
System.out.print(a[i] + " ");
System.out.println();
}
// 检测数组元素是否有序
private static boolean isSorted(Comparable[] a){
for (int i=0;i < a.length;i++){
if (less(a[i],a[i-1]))
return false;
}
return true;
}
}
希尔排序的运行时间达不到平方级别。