java - 希尔排序一个语句使速率慢了上百倍
高洛峰
高洛峰 2017-04-17 17:31:12
0
2
629
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循环的判断语句中取出,为什么排序速度会慢了上百倍呀?

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

répondre à tous (2)
迷茫

第一个函数里面的for循环运行到less() == true就退出了,第二个会一直循环运行到jless() == true之后做了很多次无用的比较,复杂度直接退化到O(n^2)了。

    伊谢尔伦

    先不管速度的问题,你这样的写法不等价啊。最内层的循环第一个执行的次数要<=第二个执行的次数。

      Derniers téléchargements
      Plus>
      effets Web
      Code source du site Web
      Matériel du site Web
      Modèle frontal
      À propos de nous Clause de non-responsabilité Sitemap
      Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!