Выбор-сортировка по узлам - Java

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

Мой выбор сортирует на самом деле все. Результат в порядке. Но выполнение не так, как должна работать сортировка выбора.

Сначала я переключил узлы вместо значения, оно работало, но не так, как должно. Поэтому я решил оставить Узел там, где он есть, и просто переключить значение.

public void selectionSort() {
    for (IntegerNode i = first; i != null; i = i.nextNode) {
        for (IntegerNode j = i.nextNode; j != null; j = j.nextNode) {
            if (i.value > j.value) {
                int temp = i.value;
                i.value = j.value;
                j.value = temp;
            }
        }
    }
}

Так что в первый раз он действительно делает то, что должен делать. Это меняет местами. Но после этого он берет наименьшее значение типа int и помещает его перед большим значением типа int вместо его переключения. Я покажу вам пример вывода

Unsorted:

2, 9, 7, 6, 3, 1, 5, 8, 

Начинаем сортировать:

1, 9, 7, 6, 3, 2, 5, 8,
1, 2, 9, 7, 6, 3, 5, 8, 
1, 2, 3, 9, 7, 6, 5, 8, 
1, 2, 3, 5, 9, 7, 6, 8, 
1, 2, 3, 5, 6, 9, 7, 8, 
1, 2, 3, 5, 6, 7, 9, 8, 
1, 2, 3, 5, 6, 7, 8, 9, 

Сортировка:

1, 2, 3, 5, 6, 7, 8, 9, 

// Вы можете видеть в строке 1 - она ​​переключает 2 с 5, именно то, что должна делать сортировка выбора. // 2-й ряд + - он просто берет маленькие целые и помещает их перед большими целыми.

Это мой первый вопрос, надеюсь, я дал достаточно кода. Если вам нужно больше, просто добавьте комментарий! Заранее спасибо.

2 ответа

Я использовал выбор-сортировку неправильно. Основная ошибка.. Для тех, кому интересно, как это выглядит правильно:

public void selectionSort() {
    for( IntegerNode i = first; i != null; i = i.nextNode){
        IntegerNode smallestElement = i;
        for ( IntegerNode j = i.nextNode; j != null; j = j.nextNode){
            if(smallestElement.value > j.value){
                smallestElement = j;
            }               
        }
        int temp = i.value;
        i.value = smallestElement.value;
        smallestElement.value = temp;
    }
}

Вы должны попробовать пройтись по вашему набору данных с помощью вашего алгоритма.

В основном проблема, с которой вы сталкиваетесь, заключается в том, что значение i всегда будет заменено следующим элементом j, если j меньше текущего значения i.

поэтому в вашей строке 1 начала сортировки (i = 1, j = 2):

9> 7 -> поменяйте местами: 1, 9, 7, 6, 3, 2, 5, 8, -> 1, 7, 9, 6, 3, 2, 5, 8,

7> 6 -> поменяйте местами: 1, 7, 9, 6, 3, 2, 5, 8, -> 1, 6, 9, 7, 3, 2, 5, 8

6> 3 -> поменяйте местами: 1, 6, 9, 7, 3, 2, 5, 8 -> 1, 3, 9, 7, 6, 2, 5, 8

3> 2 -> поменяйте местами: 1, 3, 9, 7, 6, 2, 5, 8 -> 1, 2, 9, 7, 6, 3, 5, 8

больше никаких свопов, прирост i.

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

Другие вопросы по тегам