@electrokeller

Как избежать выхода за пределы массива?

Дана задача:
Первая строка содержит число n (1≤n≤10000), вторая — n натуральных чисел, не превышающих 10. Необходимо вывести упорядоченную по неубыванию последовательность этих чисел (числа должны быть разделены пробелами).


Решаю с помощью сортировки подсчетом.
Моё решение:
import java.util.*;

class Main {
	public static void main(String[] args) {
		 Scanner in = new Scanner(System.in);
	     int n = in.nextInt();
	     int[] sourceNumbers = new int[n];
	     for (int i = 0; i < n; i++) {
	     sourceNumbers[i] = in.nextInt();
	     }
	     in.close();
	     countingSort(sourceNumbers, n);
	     for (int i = 0; i < n; i++) {
	    	 System.out.print(sourceNumbers[i] + " ");
	     }
	     
	}
	
	public static void countingSort(int[] arr, int max) {  
		int i, j, b = 0;  
		int[] c = new int[max]; 
		for (i = 0; i < max; i++)  c[i] = 0;  
		for (i = 0; i < arr.length; i++) {  
			c[arr[i]] = c[arr[i]] + 1;  
		    b = 0;  
		}  
		for (j = 0; j < max; j++) {  
			for (i = 0; i < c[j]; i++) {  
				arr[b] = j;  
		        b = b + 1;  
		    }  
		}  
	}
}

Но выдает ошибку:
Failed test #1. Run time error:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 9
	at Main.countingSort(main.java:24)
	at Main.main(main.java:12)



Почему этот код не работает, ведь никакого выхода за пределы там нет?
  • Вопрос задан
  • 4388 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Вызывать функцию сортировки надо как
countingSort(sourceNumbers, 10);Массив объявлять как
int[] c = new int[max+1];Ну и циклы должны быть до max включительно
for (i = 0; i <=max; i++)  c[i] = 0;
...
for (j = 0; j <= max; j++) {
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
@verwolfdotss
Почему
int[] c = new int[max];
?

Насколько я понимаю сортировку подсчетом если по заданию числа от 0 до 10 включительно, то этот массив должен быть размером 11.
Ответ написан
@verwolfdotss
Так же советую просмотреть на медленной скорости, для лучшего понимания алгоритма.
Ссылка
Ответ написан
@schroeder
for (i = 0; i < max; i++) c[i] = 0;

это не надо, там и так нули.

А что с параметром max? я так понял там должно 10 быть, но будет там количество введенных элементов, нет?
Ответ написан
@verwolfdotss
А что с параметром max? я так понял там должно 10 быть, но будет там количество введенных элементов, нет?


По сути если я например введу два числа
6 8

то массив будет размером 2

а обращаться я буду к 6 и 8 ячейке массива.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
ITSumma Иркутск
от 45 000 до 70 000 ₽
Корона Авто Санкт-Петербург
от 150 000 до 170 000 ₽
ВДком Самара
от 100 000 ₽