Выбор-сортировка по узлам - 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.
Вместо этого, попробуйте обновить свой алгоритм, чтобы поменять местами только когда вы найдете самый маленький элемент.