Подсчет сортировки на Java - PullRequest
1 голос
/ 14 января 2012

Пожалуйста, помогите мне со следующей реализацией Counting Sort в Java.Я новичок в Java и отладке, поэтому я не уверен в ошибке.Проблема с кодом ниже в том, что, хотя он компилируется, я не получаю никакого вывода на экран.Пожалуйста, пройдите код и предложите мне что-нибудь.Возможно, есть какая-то логическая ошибка.Спасибо

import java.io.*;
import java.lang.*;
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Cnt {
    public static void main(String[] args) throws java.lang.Exception {
        BufferedReader R = new BufferedReader(new InputStreamReader(System.in));
        int[] a ;
        int[] b;
        String inp = R.readLine();
        int N = Integer.parseInt(inp);
        a = new int[N];
        b = new int[N];
        for ( int i = 0; i< N; i++) {
            a[i] = Integer.parseInt(R.readLine());
        }
        int key = findmax(a);
         int k = key+1;
        int c[] = new int[k];
        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 < key ; i++) {
            c[i] = c[i] + c[i-1];
        }
        for ( int j = (a.length - 1); j >=0; j--) {
            b[c[a[j]]] = a[j];
            c[a[j]]= c[a[j]] -1;
        }
        //System.out.println(b[0]);
        for ( int h = 0; h > b.length; h++) {
            System.out.println(b[h]);
        }

    }
    private static int findmax(int a[])
    {
        int r;
        r = a[0];
        for ( int i =0; i < a.length; i++ ) {
            if (a[i] >= r) {
                r = a[i];
            }
        }
        return r;
    }
}

Ответы [ 2 ]

5 голосов
/ 14 января 2012

Я получаю исключение ArrayOutofBoundsException. Пожалуйста, пройдите код и предложите мне что-нибудь.

Это неправильный подход. Что вы делаете:

  1. посмотрите на трассировку стека из исключения (ваша IDE покажет вам это)

  2. посмотрите на строку в вашем коде, где в трассировке стека указано исключение

  3. прочитайте сообщение об ошибке, чтобы узнать значение индекса

  4. выясните, как могло возникнуть это значение индекса, прочитав предыдущий код

  5. если вы не можете понять это из чтения кода, используйте отладчик IDE для пошагового выполнения программы и наблюдайте , что представляют собой значения переменных / объектов и как они изменяются.


Если вы опубликовали трассировку стека исключений, мы, вероятно, могли бы выяснить это для вас Фактически, если кто-то был готов потратить некоторое время, он мог бы возможно выяснить это без трассировки стека.

Но это побеждает цель этого как учебное упражнение для вас . Вам нужно научиться делать такие вещи самостоятельно ... делая это самостоятельно.


Оригинальная версия вашего вопроса сказала это:

Согласно моей IDE, я получаю исключение ArrayOutofBoundsException

Я предположил, что поскольку ваша IDE сообщает вам, что вы получаете исключение, также покажет сообщение об исключении и (если вы нажмете на него или что-то еще) трассировку стека исключений. Конечно, моя IDE способна сделать это.

Если это не так, простой альтернативой является размещение блока try / catch вокруг всего тела main следующим образом.

public static void main(String[] args) throws Exception {
    try {
        // existing main body
        ...
    } catch (Exception ex) {
        ex.printStackTrace();
        throw ex;  // or leave this out.
    }
}
2 голосов
/ 14 января 2012

Похоже, ваша проблема находится здесь:

for ( int h = 0; h > b.length; h++) {
        System.out.println(b[h]);
    }

Ваш цикл for не работает, так как условие всегда ложно, т. Е. H> b.length, измените его на:

for ( int h = 0; h < b.length; h++) {
        System.out.println(b[h]);
    }

Надеюсь, что это может помочь.

Привет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...