Сортировка массива оставляет один элемент в неправильном положении - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь отсортировать массив в порядке возрастания, и я столкнулся с проблемой.Код сортирует массив, но он берет последнее число и помещает его в первую позицию массива.Так, например, при заказе 2,3,4,1 на выходе получается 4, 1, 2, 3. Как взять число 4 и переместить его за число 3?

public class Main {
    public static void main(String[] args) {
        int[] numbers = {2, 3, 1, 4};
        int holder = 0;

        for(int i = 0; i < numbers.length; i++){
            for(int j = 1; j < numbers.length; j++){
                if(numbers[i] < numbers[j]){
                    holder = numbers[i];
                    numbers[i] = numbers[j];
                    numbers[j] = holder;
                }
            }
        }

        // prints array
        for(int i = 0; i < numbers.length; i++){
            System.out.println(numbers[i]);
        }
    }
}

Вывод:

4
1
2
3

Ответы [ 3 ]

0 голосов
/ 19 октября 2018

Вы должны немного изменить цикл.

for(int i = 0; i < numbers.length-1; i++){  //modify at this line
    for(int j = i+1; j < numbers.length; j++){  //also modify at this line
        if(numbers[i] > numbers[j]){  //modify to get ascending oder
              holder = numbers[i];
              numbers[i] = numbers[j];
              numbers[j] = holder;
        }
    }
}
0 голосов
/ 19 октября 2018

Есть две основные проблемы.

Одна из них заключается в том, что вы меняете некоторые элементы дважды.Вы всегда должны убедиться, что i меньше j, чтобы numbers[i] было слева от numbers[j].То, как работают ваши циклы, в более поздних итерациях j начинается ниже i.Например, когда i равно 2, внутренние циклы начинаются с j в 1. Чтобы это исправить, вы всегда можете начать j с 1 места выше i:

for(int j = i + 1; j < numbers.length; j++) {

Если выисправить, что вы заметите вторую проблему: массив отсортирован в обратном порядке!Это потому, что сравнение < обратное.Вы хотите поменять местами, когда левый элемент на больше , чем правый, а не когда он меньше.Если они меньше, они уже в правильном порядке.

if(numbers[i] > numbers[j])
0 голосов
/ 19 октября 2018

Похоже, что одно из возможных, неэффективных решений было бы изменить:

for (int j = 1; j < numbers.length; j++) {

На следующее:

for (int j = 0; j < numbers.length; j++) {

Это непреднамеренно дважды меняет каждое значение в массиве,но работает!

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