2013-02-28 4 views
0

Теперь я работаю над сортировкой radix, которая реализует сортировку count. Я думаю, что по большей части понимал и следовал псевдокоду, но я получаю массив из оценки точности:Radix Сортировка и подсчет сортировки

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 12 
    at RunRadixSort.radixSort(RunRadixSort.java:47) 
    at RunRadixSort.main(RunRadixSort.java:15) 

Моего кода

import java.text.DecimalFormat; 
    import java.util.Arrays; 


    import java.text.DecimalFormat; 
import java.util.Arrays; 


public class RunRadixSort { 


    public static void main(String[] args) { 

     int[] sortNumbers = {4,5,6,2,3,7,2,1,23,5,13}; 
     int[] sorted = new int[sortNumbers.length]; 
     DecimalFormat df = new DecimalFormat("#.########"); 
     int max = getMax(sortNumbers); 
     long timeStart = System.nanoTime(); 
     sorted = radixSort(sortNumbers, max); 
     long timeEnd = System.nanoTime(); 
     long elapsedTime = timeEnd - timeStart; 
     double time = (double)elapsedTime/1000000; 
     System.out.println(Arrays.toString(sorted)); 
     System.out.println("\nTotal Execution Time: " + df.format(time)+ " miliseconds"); 
    } 

    public static int getMax(int[] A){ 
     int max = A[0]; 
     for(int i = 1; i < A.length; i++){ 
      if(A[i] > max){ 
       max = A[i]; 
      } 
     } 
     return max; 
    } 

    public static int[] radixSort(int[] A, int d){ 
     int[] B = new int[A.length]; 
     int[] C = new int[d + 1]; 
     for(int i = 0; i < d; i++){ 
      for(int k = 0; k < A.length; k++){ 
       C[A[k]]++; 
      } 
      int total = 0; 
      for(int l = 0; l < d; l++){ 
       int temp = C[l]; 
       C[l] = total; 
       total += temp; 
      } 
      for(int m = 0; m < A.length; m++){ 
       B[C[A[m]]] = A[m]; 
       C[A[m]]++; 
      } 
     } 
     return B; 
    } 
} 

ответ

1

Вы не увеличивающиеся J. Это может быть опечатка:

for(int j = 0; j < d; i++){ 

попробовать это:

for(int j = 0; j < d; j++){ 
+0

Хорошо, тогда я вернусь к ошибке за пределами, которую я опубликовал выше. – shinjuo

+0

Какая линия составляет 47? –

+0

Извините, что здесь для (int m = 0; m shinjuo

0

В строке for(int j = 0; j < d; i++){

должно быть for(int j = 0; j < d; j++){

Кроме того, линия C[A[k]] = C[A[k]] + 1; При к = 8 и A [K] = 23 вы получите исключение ArrayOutOfBoundsException, потому что, когда объявляется C [], он объявляется как массив le ngth 23, который можно индексировать только от 0 до 22 включительно. Фактический диапазон значений должен включать от 0 до макс.

Таким образом, вы должны либо объявить С [], как int[] C = new int[d+1]; или хранить до значений в C[A[k]-1] = C[A[k]-1] + 1;, в зависимости от того, рассматривается ли нуль приемлемого значения в sortNumbers входного массива.

Вопрос и код изменили однако. Этот блок кода суммирует значения и все больше добавляет их в массив C.

for(int l = 0; l < d; l++){ 
      int temp = C[l]; 
      C[l] = total; 
      total += temp; 
     } 

Тогда следующий блок

for(int m = 0; m < A.length; m++){ 
      B[C[A[m]]] = A[m]; 
      C[A[m]]++; 
     } 

использует значение записей в массиве C, как индексы в массиве B, однако B является тот же размер, что и массив A.

Вы уверены, что C должен содержать общее количество значений, а не общее количество вхождений значений?