Java快速排序返回部分排序列表

时间:2012-07-15 03:06:05

标签: java sorting quicksort

我的程序(使用字母频率解密事物的解密器)有两个ArrayLists,用于跟踪字母频率。我将这些ArrayLists配对,使得一个(输入中的字符列表)始终链接到另一个(输入中的频率列表),以便索引i中的字符始终对应于索引i处的频率在另一个。我使用了一个快速排序算法按降序排序。以下是快速排序和交换方法的代码:

private static void quickSort(int low, int high){


    int i = low;
    int j = high;
    long middle = freqInCiphertext.get((low+high)/2);

    while (i < j) {
        while (freqInCiphertext.get(i) > middle) {
            i++;
        } //End while
        while (freqInCiphertext.get(j) < middle) {
            j--;
        }//End while
        if (j >= i) {
            swap(i, j);
            i++;
            j--;
        } // End if
    } // End while


    if (low<j) {
        quickSort(low, j);
    } else if (i<high) {
        quickSort(i, high);
    } //end if
}//End quickSort

private static void swap(int i, int j) {
int tempInt = freqInCiphertext.get(i);
String tempString = charsInCiphertext.get(i);

freqInCiphertext.set(i, freqInCiphertext.get(j));
charsInCiphertext.set(i, charsInCiphertext.get(j));

freqInCiphertext.set(j, tempInt);
charsInCiphertext.set(j, tempString);
}// End swap

但是,当我运行我的代码时,它会返回部分排序的数组列表,如下所示:

[ , e, t, a, o, n, i, h, r, d, l, u, s, m, z, q, x, j, v, k, p, f, w, c, b, y, g]
[64031, 25856, 19326, 17571, 16398, 14349, 14200, 12784, 11617, 9930, 8391, 5820, 12934, 5636, 173, 178, 312, 356, 1929, 2175, 3186, 4310, 5479, 4666, 3491, 4673, 5100]

任何人都可以在算法中看到任何错误吗?我已经尝试了几种不同的方法(比如&gt; =而不是&gt;等)而没有运气。

1 个答案:

答案 0 :(得分:5)

因为两者都可以是&gt;比低,我可以&lt;在高的同时,你不想做“否则if(i&lt; high)”。这应该只是在一个单独的if Likeo:

if (low<j) {
    quickSort(low, j);
}

if (i<high) {
    quickSort(i, high);
}