Я работаю через Deitel & Deitel's «Java - как программировать», и я в тупике о том, почему эта реализация, с которой я столкнулся с универсальным методом сортировки, не работает. Я уверен, что я должен упустить некоторые мелкие детали, но, исследуя API и несколько ресурсов на Generics, я начинаю холодно. В то время как программа работает и выполняет какой-то вид, она определенно НЕ выйдет отсортированной в цифровом порядке! Я не могу сказать, не ошибаюсь ли я Generics, или просто алгоритм сортировки выбора. Любая помощь будет оценена!SelectionSort реализован с использованием общего метода - неправильные результаты
Выход получаю на запуск своего рода отбор на INTArray является: 0, 1, -23, 7, 54
Выход для floatArray после сортировки: -1,1, -10,3, 0,4, 4,5
UPDATE Я просто попытался это без использования отрицательных значений и сортирует в порядке, то, что о ???
Вот полный класс сортировщик, который выполняет сортировку выбора:
import java.util.Arrays;
import java.util.ArrayList;
public class Sorter {
public static void main(String[] args) {
Integer[] intArray = {1, 7, -23, 54, 0};
Float[] floatArray = {0.4f, -10.3f, 4.5f, -1.1f};
ArrayList<Integer> intList = new ArrayList<>(Arrays.asList(intArray));
ArrayList<Float> floatList = new ArrayList<>(Arrays.asList(floatArray));
System.out.printf("Lists before selectionSort: %n%s%n%s%n%n",
intList, floatList);
selectionSort(intList);
selectionSort(floatList);
System.out.printf("Lists after selectionSort: %n%s%n%s%n%n",
intList, floatList);
}
public static <T extends Comparable<T>> void selectionSort(ArrayList<T> list) {
// helps determine whether or not a swap will occur
boolean needsSorting = false;
// keeps track of the index of the smallest value
int smallest = 0;
// outer for walks the portion of the list that will be swapped
for (int i = 0; i < list.size() - 1; i++) {
// inner for searches for a smaller value than the front of list
for (int j = i + 1; j < list.size(); j++) {
// if the inner value is less than the outer value
if (list.get(j).compareTo(list.get(i)) < 0) {
// store the index of the smaller value
smallest = j;
// set the boolean flag to true so the sort will happen
needsSorting = true;
}
}
// if the list needs sorting
if (needsSorting) {
// get the value of the outer loop, store in generic variable
T temp = list.get(i);
// replace value of outer loop with value at the smallest index
list.set(i, list.get(smallest));
// replace value at what was smallest index with the value that
// was at the index of the outer loop
list.set(smallest, temp);
needsSorting = false;
}
}
}
}
Спасибо, я поймал, что как только вы указали, где проблема. Ты да, человек! –
Отметьте мое редактирование, я думаю, что исправление должно работать, потому что вы должны обновить наименьшую переменную, чтобы начать с начала несортированного списка, поскольку отсортированный список увеличивается по длине на 1 после каждой итерации. –