2016-05-01 9 views
0

Я не совсем понимаю сортировку radix, поэтому мне сложнее написать эту программу. Мне нужно отсортировать массив строк, который считывается из .txt-файла. Я смог прочитать файл и ввести строки в массив. Строка может содержать буквы или специальные символы. Мне нужна помощь в написании кода для сортировки массива. Мне кажется, что я близок к правильному коду, но я застрял и не знаю, что еще делать. Было бы очень полезно, если бы я мог получить помощь и указать мне в правильном направлении.Radix Сортировка массива строк с использованием очереди в Java

Каждая строка имеет одинаковое количество символов. Я также использую stackPackage, который содержит класс очереди. Мне нужно изменить код, который мой профессор дал мне, чтобы сортировать строки.

Вот код, который я начал с:

import queuepackage.*; 

общественного класса Radix {

public static void main(String[] args) { 
    int[] array = {143,934,782,687,555,222,111,213,842,2000}; 
    printArray(array); 
    radixSort(array, 1000); 
    printArray(array); 
} 

public static void printArray(int[] array) { 
    for (int i = 0; i < array.length; i++) { 
     System.out.print(array[i] + ", "); 
    } 
    System.out.println(); 
} 

public static void radixSort(int[] array, int maxPowerOf10) { 

    Queue[] queueArray = new Queue[10]; 

    for (int queueNum = 0; queueNum < 10; queueNum++) { 
     queueArray[queueNum] = new Queue(); 
    } 

    for (int powerOf10 = 1; powerOf10 <= maxPowerOf10; powerOf10 = powerOf10 * 10) { 
     for (int item = 0; item < array.length; item++) { 
      int digit = getDigit(array[item], powerOf10); 
      queueArray[digit].enqueue(new Integer(array[item])); 
     } 
     int item = 0; 
     for (int queueNum = 0; queueNum < 10; queueNum++) { 
      while (!queueArray[queueNum].isEmpty()) { 
        array[item] = ((Integer) queueArray[queueNum].dequeue()).intValue(); 
        item++; 
      } 
     } 
    } 
} 

public static int getDigit(int number, int powerOf10) { 
    return (number/powerOf10)%10; 
} 

}

Это то, что у меня есть.

длина = длина массива

wordLen = длина строки в массиве

Вот мой текущий код метода RadixSort:

public static void radixSort(String[] array, int length, int wordLen) { 
    Queue[] queueArray = new Queue[256]; 
    for (int queueNum = 0; queueNum < 256; queueNum++) { 
     queueArray[queueNum] = new Queue(); 
    } 
    for (int len = 0; len < wordLen; len++) { 
     for (int item = 0; item < length; item++) { 
      int letter = array[item].charAt(len); 
      queueArray[letter].enqueue(new String(array[item])); 
     } 
     int item = 0; 
     for (int queueNum = 0; queueNum < 256; queueNum++) { 
      while (!queueArray[queueNum].isEmpty()) { 
       array[item] = ((String) queueArray[queueNum].dequeue()).toString(); 
       item++; 
      } 
     } 
    } 
} 

ответ

0

Это почти работает, вы просто необходимо повторить это слово назад, посмотреть на вторую петлю

public static void radixSort(String[] array, int length, int wordLen) { 
    Queue[] queueArray = new Queue[256]; 
    for (int queueNum = 0; queueNum < 256; queueNum++) { 
     queueArray[queueNum] = new Queue(); 
    } 
    for (int len = wordLen-1; len >= 0; len--) { 
     for (int item = 0; item < length; item++) { 
      int letter = array[item].charAt(len); 
      queueArray[letter].enqueue(new String(array[item])); 
     } 
     int item = 0; 
     for (int queueNum = 0; queueNum < 256; queueNum++) { 
      while (!queueArray[queueNum].isEmpty()) { 
       array[item] = ((String) queueArray[queueNum].dequeue()).toString(); // Here you need to swap the 
       item++; 
      } 
     } 
    } 
} 

Если вы повторяете его обычным способом, вы теряете предыдущую информацию, поэтому последние символы являются самыми важными.

Удачи вам!

0

Единственная ошибка в коде, которую я вижу, это то, что в RadixSort вы хотите начать с сортировки по наименее значащей цифре и перейти к более значительным цифрам по мере того, как вы идете. В этом случае, однако, вы начинаете с левой стороны и идем направо, что неверно для естественного упорядочения сортировки по строкам.
Это, однако, можно легко устранить, изменив for (int len = 0; len < wordLen; len++) на for (int len = wordLen - 1; len >= 0; len--).

+0

ДА это работало. Спасибо огромное! – Garret

0

Изменение for (int len = 0; len < wordLen; len++) в for (int len = wordLen - 1; len >= 0; len--) работал и делает моя программа делает то, что она должна

Смежные вопросы