簡體   English   中英

帶有計數排序的基數排序錯誤地對轉換為二進制的字母進行排序

[英]Radix sort with counting sort incorrectly sorts letters converted to binary

我無法理解為什么當我將輸入轉換為二進制時,我的帶有計數排序的基數排序代碼不能正確地對輸入進行排序。 我基本上對表示為十進制的字母使用相同的代碼,它們工作得很好,但在這里它甚至還差得遠。

下面是參與二進制基數排序的代碼:

    static String[] countSort(String[] input, int position)
    {
        int[] count = new int[2];
        int n = input.length;

        char temp;
        for (String value : input) {
            temp = value.charAt(value.length()-1 - position);

            count[temp-'0']++;
        }

        for (int i = 1; i < 2; i++) {
            count[i] = count[i] + count[i - 1];
        }

        String[] output = new String[n];
        for (int i = n - 1; i >= 0; i--) {
            temp = input[i].charAt(input[i].length()-1 - position);

            output[count[temp-'0']-1] = input[i];
            count[temp-'0']--;
        }

        return output;
    }

    public static String[] radixSortBinary(String str, int stringLength) {

        //convert letters to binary
        char[] charArr = str.toCharArray();
        String[] array = new String[charArr.length];
        for (int i=0; i<charArr.length; i++)
            array[i] = Integer.toBinaryString(charArr[i]);

        System.out.println("Binary input:" + Arrays.toString(array));

        //iterate over each character position (starting from the least significant)
        for (int i = stringLength-1; i >= 0; --i) {
            array = countSort(array, i);
        }


        System.out.println("Binary output:" + Arrays.toString(array));

        //convert back to letters
        StringBuilder sb = new StringBuilder();
        for (int i=0; i<array.length; i++) {
            Arrays.stream(array[i].split("(?<=\\G.{7})")).forEach(s -> sb.append((char) Integer.parseInt(s, 2)));
            array[i] = sb.toString();
            sb.setLength(0);
        }

        return array;
    }

    public static void main(String[] args) {

    Scanner scan = new Scanner(System.in);
    String input2 = scan.next();

    String[] result = radixSortBinary(input2, 7);
    System.out.println("Output:" + Arrays.toString(result));
}

安慰:

input: 
ababababababa
Binary input:[1100001, 1100010, 1100001, 1100010, 1100001, 1100010, 1100001, 1100010, 1100001, 1100010, 1100001, 1100010, 1100001]
Binary output:[1100001, 1100010, 1100001, 1100010, 1100001, 1100010, 1100001, 1100010, 1100001, 1100010, 1100001, 1100010, 1100001]
Output:[a, b, a, b, a, b, a, b, a, b, a, b, a]

另一種情況:

input: 
abcdefgdftglkgfdj
Binary input:[1100001, 1100010, 1100011, 1100100, 1100101, 1100110, 1100111, 1100100, 1100110, 1110100, 1100111, 1101100, 1101011, 1100111, 1100110, 1100100, 1101010]
Binary output:[1100100, 1100100, 1100100, 1110100, 1101100, 1100010, 1101010, 1100110, 1100110, 1100110, 1100001, 1100101, 1100011, 1101011, 1100111, 1100111, 1100111]
Output:[d, d, d, t, l, b, j, f, f, f, a, e, c, k, g, g, g]

任何幫助將不勝感激!

錯誤在這里:

//iterate over each character position (starting from the least significant)
for (int i = stringLength-1; i >= 0; --i) {
    array = countSort(array, i);
}

該代碼不執行注釋所說的操作。 實際上,這會從最重要的字符開始遍歷每個字符 position。 有諸如 MSB-radix 之類的東西,但那是不同的。

反轉那個循環使它對我來說正常工作。

順便說一句,您可能應該確保所有二進制字符串的長度相同,必要時用前導零填充。 直接處理 integer 字符表示的位不需要將其作為顯式步驟。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM