2016-02-23 1 views
-1

Пожалуйста, дайте мне знать вопрос, который у меня есть в этом коротком коде. Я попытался выполнить алгоритм из книги и преобразовать ее в программу, но сделал некоторую ошибку в этом процессе. Его метательное arrayoutofbounds исключенияПрограммирование Проблема в моем счете сортировки algo

Algo which i tried to follow is bellow: 

countingsort(a,b,k) 
    1)let c[0..k] be a new array 
    2)for i =0 to k 
    3) c[i]=0; 
    4)for j=1 to a.length 
    5) c[a[j]]=c[a[j]]+1 
    6)for i = i to k 
     c[i] = c[i] + c[i-1] 
    7)for j=a.length downto 1 
     b[c[a[j]]]= a[j] 
     c[a[j]] = c[a[j]]-1 

public class CountingSort { 
    public static void main(String[] args) { 
     int[] array_A = {6, 0, 2, 0, 1, 3, 4, 6, 1, 3, 2}; 
     int[] array_B = new int[array_A.length]; 

     int k = 6; 
     countingSort(array_A,array_B,k); 
     //System.out.println(array_B); 


    } 
    public static void countingSort(int[] A, int[] B, int k){ 
     int[] C = new int[k+1]; 
     for(int i = 0; i<=k; i++){ 
      C[i] = 0; 
     } 
     for(int j = 0; j<A.length; j++){ 
      C[A[j]] = C[A[j]] + 1; 

     } 
     for(int i = 1; i<=k; i++){ 
      C[i] = C[i] + C[i-1]; 
     } 
     for(int j = A.length-1; j>=1; j--){ 
      B[C[A[j]]] = A[j]; 
      C[A[j]] = C[A[j]] - 1; 
     } 

     System.out.println(Arrays.toString(B)); 


    } 

} 

Error: 
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 11 
    at importantPrograms.CountingSort.countingSort(CountingSort.java:22) 
    at importantPrograms.CountingSort.main(CountingSort.java:11) 
+0

где проблема? в чем вопрос? –

+0

обновленный вопрос. Так что извините за неполный вопрос раньше. –

+0

Каков алгоритм, данный в книге? Может быть проще понять логику с чем-то, чтобы сравнить ее с –

ответ

0

Вот модифицированный код, который работал для меня.

import java.util.Arrays; 
public class CountingSort { 
    public static void main(String[] args) { 
     int[] array_A = {6, 0, 2, 0, 1, 3, 4, 6, 1, 3, 2}; 
     int[] array_B = new int[array_A.length]; 
     int k = 6; 
     countingSort(array_A,array_B,k); 
     System.out.println(Arrays.toString(array_B)); 
    } 
    public static void countingSort(int[] A, int[] B, int k){ 
     int[] C = new int[k+1]; 
     for(int i = 0; i<=k; i++){ 
      C[i] = 0; 
     } 
     for(int j = 0; j<A.length; j++){ 
      C[A[j]] ++; 
     } 
     for(int i = 1; i<=k; i++){ 
      C[i] += C[i-1]; 
     } 
     for(int j = A.length-1; j>=0; j--){ 
      B[--C[A[j]]] = A[j]; 
     } 
    } 
} 

В идеале, вместо жесткого кодирования максимального значения (6), вы бы найти максимальное программно и размера полезного массив соответственно. Такие, как

В основной метод

countingSort(array_A,array_B,max(array_A)); 

Макс метод

public int max(int[] arr){ 
    int m = 0; 
    for(int i : arr){ 
     if(i>m){ 
      m = i; 
     } 
    } 
    return m; 
} 
+0

Сделал то, что вы предложили. Он по-прежнему дает ту же ошибку. –

+0

@bhavishyatyagi После запуска и тестирования кода я обнаружил, что ошибка возникает в последнем цикле, когда вы пытаетесь поместить все на свои места. 'C [6]' имеет значение 11, то есть число элементов в исходном массиве. так как это так, максимальный индекс, который вы должны использовать, - 10. Я обновил свой ответ с помощью кода, который работал для меня. Другой вариант - вставить как «B [C [A [j]] - 1] = A [j]'; –

+0

Спасибо за ценные советы и помощь. Теперь я понимаю проблему. –

0

Изменить

  1. C[A[j]] = C[A[j] + 1]; к C[A[j]] = C[A[j]] + 1;, потому что вы должны подсчитать количество повторения числа.
+0

Эй, я исправил это. Но он все еще бросает решетку изгибов –

0

Я понятия не имею, что вы делаете, но есть только небольшая ошибка в вашей второй цикл. j<A.length to j<C.length

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