2016-04-06 2 views
0

Я работаю через 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

Проблема может происходить на этой линии,

if (list.get(j).compareTo(list.get(i)) < 0) 

Вместо list.get(i), он должен быть list.get(smallest)

Кроме того, вы не обновляете самые маленькие, когда вы должны делать это на каждой итерации внешнего цикла. Добавьте эту строку кода сразу после for (int i = 0; i < list.size() - 1; i++)

smallest = i; 
+0

Спасибо, я поймал, что как только вы указали, где проблема. Ты да, человек! –

+1

Отметьте мое редактирование, я думаю, что исправление должно работать, потому что вы должны обновить наименьшую переменную, чтобы начать с начала несортированного списка, поскольку отсортированный список увеличивается по длине на 1 после каждой итерации. –

0

DaneBrick поставил меня в правильном направлении. Мне нужно было установить наименьшую переменную равной i, счетчику для внешнего цикла, для каждой итерации внешнего цикла. Вот скорректированная часть кода:

for (int i = 0; i < list.size() - 1; i++) { 
     // inner for searches for a smaller value than the front of list 
     //*** NEW PORTION, DIDN'T HAVE THIS BEFORE ***// 
     smallest = i; 
     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(smallest)) < 0) { 
       // store the index of the smaller value 
       smallest = j; 
       // set the boolean flag to true so the sort will happen 
       needsSorting = true; 
      } 
     } 
Смежные вопросы