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; } public static void sort(Comparable[] a) { int n = a.length; int h = 1; while (h < n / 3) { h = 3 * h + 1; } while (h >= 1) { for (int i = h; i < n; i++) { for (int j = i; j >= h && less(a[j], a[j - h]); j -= h) { exch(a, j, j - h); } } h /= 3; } } public static void sort(Comparable[] a) { int n = a.length; int h = 1; while (h < n / 3) { h = 3 * h + 1; } while (h >= 1) { for (int i = h; i < n; i++) { for (int j = i; j >= h ; j -= h) { if (less(a[j], a[j - h])) { exch(a, j, j - h); } } } h /= 3; } }
第二个sort方法只是把 if 语句从for循环的判断语句中取出,为什么排序速度会慢了上百倍呀?
第一个函数里面的for循环运行到less() == true之后做了很多次无用的比较,复杂度直接退化到O(n^2)了。
less() == true
就退出了,第二个会一直循环运行到j先不管速度的问题,你这样的写法不等价啊。最内层的循环第一个执行的次数要<=第二个执行的次数。