Я взял ваш код и внес некоторые изменения в sort
, а также в функцию findMax
. Теперь мы получаем правильный вывод.
sort
функция: я не уверен, почему у вас есть условие перед свопом, это предотвратит обмен некоторых из findMax
. Кроме того, я предполагаю, что вы делаете array.length - k
, потому что вы, возможно, захотите сохранить максимум в последнем индексе и выполнить цикл, чтобы найти следующий максимум и так далее. Для этого ваша логика кажется неправильной.
findMax
функция: индекс должен начинаться с 0
и идти до upper
.
Подробности см. В приведенном ниже коде:
public static void sort(int[] array) {
int maxindex = 0;
for(int k=array.length - 1; k >= 0; k--) {
maxindex = findMax(array, k);
swap(array, k, maxindex);
}
}
public static int findMax(int[] array, int upper) {
//"upper" controls where the inner loop of the selection sort ends
int max = array[0];
int maxindex = 0;
for(int i = 0; i <= upper; i++) {
if(max < array[i]) {
max = array[i];
maxindex = i;
}
}
return maxindex;
}
Ввод: [4, 2, 3, 8, 7, 1, 9, 10, 15, 12, 11, 13]
Выход: [1, 2, 3, 4, 7, 8, 9, 10, 11, 12, 13, 15]