java - 希尔排序一个语句使速率慢了上百倍
高洛峰
高洛峰 2017-04-17 17:31:12
0
2
715
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)
迷茫

La boucle for dans la première fonction s'exécute jusqu'à less() == true et se termine, et la seconde s'exécute en boucle jusqu'à j<h avant de quitter. La comparaison prend évidemment du temps et peut être considérée comme une opération. La deuxième fonction fait de nombreuses comparaisons inutiles après less() == true, et la complexité se dégrade directement en O(n^2).

伊谢尔伦

Peu importe la question de vitesse, votre façon d'écrire n'est pas équivalente. Le nombre d'exécutions de la première boucle dans la boucle la plus interne doit être

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal