代码实现:
/**
* 希尔排序,比对插入排序、选择排序都快许多,测试发现可提高100倍
*
* @param a
*/
public static void ShellSort(Comparable[] a) { // 将a[]按升序排列
int N = a.length;
int h = 1;
while (h < N / 3)
h = 3 * h + 1; // 1, 4, 13, 40, 121, 364, 1093, ...
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;
}
}
测试代码:
//生成随机字符串
int size = 40000;
String[] s = new String[size];
for (int i = 0; i < size; i++) {
s[i] = RandomStringUtils.randomAlphanumeric(10);
}
System.out.println("isSorted " + Smath.isSorted(s));
long startTime = System.currentTimeMillis();
//采用"希尔排序"算法对数组进行排序
Smath.ShellSort(s);
long doneTime = System.currentTimeMillis();
System.out.println("isSorted " + Smath.isSorted(s) + "\nestimate " + (doneTime - startTime) + " milliseconds");
测试结果:
isSorted false
isSorted true
estimate 34 milliseconds