Сортировка выбора по убыванию с выводом во время выполнения

Напишите метод selectionSortDescendTrace () void, который принимает целочисленный массив и сортирует массив в порядке убывания. Метод должен использовать вложенные циклы и выводить массив после каждой итерации внешнего цикла, таким образом выводя массив N-1 раз (где N - размер). Завершите main (), чтобы прочитать список до 10 положительных целых чисел (заканчивающихся на -1), а затем вызовите метод selectionSortDescendTrace ().

Если ввод:

20 10 30 40 -1

тогда вывод:

40 10 30 20
40 30 10 20
40 30 20 10

Мой код:

import java.util.Scanner;

public class MyProgram {

public static void selectionSortDescendTrace( int [] numbers, int numElements)
{
    for (int i = 0; i < numbers.length - 1; i++) {
        if(numbers[i] > 0) {
        int maxElementIndex = i;
        for (int j = i + 1; j < numbers.length; j++) {
            if (numbers[maxElementIndex] < numbers[j]) {
                maxElementIndex = j;
            }
        }
            int temp = numbers[i];
            numbers[i] = numbers[maxElementIndex];
            numbers[maxElementIndex] = temp;
            
            for (int element: numbers) {
                 if(element > 0)
                    System.out.print(element + " ");
                }
                 System.out.println("");
            }
     }
}
   
public static void main(String[] args){  
    Scanner scnr = new Scanner(System.in);
    
    int input, i = 0;
    int numElements = 0;
    int [] numbers = new int[10];
    
    do{
        input = scnr.nextInt();
        if(input != -1){
           numbers[i] = input;
           i++;
           numElements++;
        }
        
        }while(input != -1);
           selectionSortDescendTrace(numbers, numElements);
    
}  

}

Мой вывод:

40 10 30 20
40 30 10 20
40 30 20 10
40 30 20 10

Я не уверен, почему последняя строка повторяется дважды ... Пожалуйста, помогите.


person Papi Ritz    schedule 01.09.2020    source источник


Ответы (1)


Проблема в цикле for вашего метода selectionSortDescendTrace. Потому что цикл выполняется numbers.length - 1 раз (for (int i = 0; i < numbers.length - 1; i++)). numbers.length равно 10, потому что вы определяете длину массива как 10 в вашем методе main.

Если вы измените условие в первом цикле for метода selectionSortDescendTrace следующим образом, оно должно сработать:

public static void selectionSortDescendTrace(int[] numbers, int numElements) {
    for (int i = 0; i < numElements - 1; i++)
        if (numbers[i] > 0) {
            //...

Этот вопрос может быть полезно понять, как находить подобные ошибки.

person Tobias    schedule 01.09.2020