![](/img/trans.png)
[英]Radix sort incorrectly sorts an array of strings when they have different lengths
[英]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.