2017-01-31 8 views
0

Я пытаюсь закодировать сортировку, используя ArrayList. Моя программа требует, чтобы я создал массив размером 20 и заполнил его случайными целыми числами от 1 до 1000 (без ввода пользователем или жесткого кода). Вывод потребует отображения исходного несортированного списка целых чисел и отображения каждого прохода алгоритма сортировки на отдельной строке.Выбор Сортировка по ArrayList

Я попытался создать метод для сортировки сортировки, так что вот где я застрял, потому что я не уверен, как реализовать код в моем основном методе.

Пример того, как я хочу, чтобы мой выход, чтобы выйти, как показано ниже (хотя он показывает только 5 целых чисел, когда я пытаюсь сделать 20):

Unsorted список: 3 68 298 290 1
Проход 1: 1 68 298 290 3
Проход 2: 1 3 298 290 68
Проход 3: 1 3 68 290 298
Pass 4: 3 68 1 290 298

// Used to capture keyboard input 
import java.util.*; 

// Our class called SelectionSort 
public class SelectionSort { 

// Create doSelectionSort method 
public static int[] doSelectionSort(int[] arr) { 
    for (int i = 0; i < arr.length - 1; i++) { 
     int pos = i; 
     // find position of smallest num between (i + 1)th element and last element 
     for (int j = i + 1; j <= arr.length; j++) { 
      if (arr[j] < arr[pos]) 
       pos = j; 

      // Swap min (smallest num) to current position on array 
      int min = arr[pos]; 
      arr[pos] = arr[i]; 
      arr[i] = min; 
     } 
    } 
    return arr; 
} 

// Main method 
public static void main(String[] args) { 
    ArrayList<Integer> array = new ArrayList<Integer>(); // Declare and instantiate a new ArrayList object 
    Scanner userChoice = new Scanner(System.in); // User input for quitting program 
    String choice = ""; // Will hold user choice to quit program 
    boolean inputFlag = false; // True if input is valid, false otherwise 

    // Repeat program until user chooses to quit 
    while (inputFlag = true) { 
     System.out.print("\nWould you like to continue the program? (Y/N): "); 
     choice = userChoice.nextLine(); 
     if (choice.equalsIgnoreCase("Y")) { 
      try { 
       /* Create an array of size 20 and populate it with random integers between 1 and 1000. 
       Do not ask user for the numbers and do not hard code them */ 
       for (int i = 0; i < 20; i++) { 
        int integer = (int)(1000.0 * Math.random()); 
        array.add(integer); 
       } 
       System.out.print("\nUNSORTED LIST: "); 

       //Display the 20 size of the unsorted ArrayList 
       for (int i = 0; i < array.size() - 1; i++) { 
        System.out.print(array.get(i) + ", "); 
       } 
       // Shows very last integer with a period 
       System.out.print(array.get(array.size() - 1) + "."); 
       System.out.println(); 
      } 

      catch (IndexOutOfBoundsException e) { 
       System.out.println("\nThere is an out of bounds error in the ArrayList."); 
      } 
      // Display each pass of the sorting algorithm on a separate line 
      for (int i = 1; i < array.size(); i++) { 
       System.out.print("PASS " + i + ": "); 
       for (int arr2:array) { 
        System.out.print(arr2 + ", "); 
       } 
       System.out.print(array.get(array.size() - 1) + ".\n"); 
      } 
     array.clear(); 
     } 
     else if (choice.equalsIgnoreCase("N")) { 
      break; 
     } 
     // Error message when inputting anything other than Y/N 
     else { 
      System.out.println("\nERROR. Only Y, y, N, or n may be inputted."); 
      System.out.println("Please try again."); 
     } 
    } 
} 
} 

У меня также возникли проблемы с удалением последнего номера с каждого прохода, потому что он отображается дважды .. Есть идеи, что я должен делать?

Извините за отсутствие моей кодировки, я все еще пытаюсь это понять.

ответ

3

Я установил свой код, он должен работать.

// Used to capture keyboard input 
import java.util.*; 

// Our class called SelectionSort 
public class SelectionSort { 

    // Create doSelectionSort method 
    public static void doSelectionSort(ArrayList<Integer> arr) { 
     for (int i = 0; i < arr.size(); i++) { 
      // find position of smallest num between (i + 1)th element and last element 
      int pos = i; 
      for (int j = i; j < arr.size(); j++) { 
       if (arr.get(j) < arr.get(pos)) 
        pos = j; 
      } 
      // Swap min (smallest num) to current position on array 
      int min = arr.get(pos); 
      arr.set(pos, arr.get(i)); 
      arr.set(i, min); 
      printOut(i + 1, arr); 
     } 
    } 

    private static void printOut(int pass, ArrayList<Integer> array) { 
     System.out.print("PASS " + pass + ": "); 
     for (int i = 0; i < array.size() - 1; i++) { 
      System.out.print(array.get(i) + ", "); 
     } 
     // Shows very last integer with a period 
     System.out.print(array.get(array.size() - 1) + "."); 
     System.out.println(); 
    } 

    // Main method 
    public static void main(String[] args) { 
     ArrayList<Integer> array = new ArrayList<Integer>(); // Declare and instantiate a new ArrayList object 
     Scanner userChoice = new Scanner(System.in); // User input for quitting program 
     String choice = ""; // Will hold user choice to quit program 
     boolean inputFlag = false; // True if input is valid, false otherwise 

     // Repeat program until user chooses to quit 
     while (inputFlag = true) { 
      System.out.print("\nWould you like to continue the program? (Y/N): "); 
      choice = userChoice.nextLine(); 
      if (choice.equalsIgnoreCase("Y")) { 
       try { 
        /* Create an array of size 20 and populate it with random integers between 1 and 1000. 
        Do not ask user for the numbers and do not hard code them */ 
        for (int i = 0; i < 20; i++) { 
         int integer = (int)(1000.0 * Math.random()); 
         array.add(integer); 
        } 
        System.out.print("\nUNSORTED LIST: "); 

        //Display the 20 size of the unsorted ArrayList 
        for (int i = 0; i < array.size() - 1; i++) { 
         System.out.print(array.get(i) + ", "); 
        } 
        // Shows very last integer with a period 
        System.out.print(array.get(array.size() - 1) + "."); 
        System.out.println(); 
        doSelectionSort(array); 
       } 

       catch (IndexOutOfBoundsException e) { 
        System.out.println("\nThere is an out of bounds error in the ArrayList."); 
       } 
      } 
      else if (choice.equalsIgnoreCase("N")) { 
       break; 
      } 
      // Error message when inputting anything other than Y/N 
      else { 
       System.out.println("\nERROR. Only Y, y, N, or n may be inputted."); 
       System.out.println("Please try again."); 
      } 
     } 
    } 
} 
+0

Если вы найдете мой ответ полезным, отметьте его как accpeted. –

0

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

public static int[] doSelectionSort(int[] arr) { 
    for (int i = 0; i < arr.length - 1; i++) { 
     int pos = i; 
     // find position of smallest num between (i + 1)th element and last element 
     for (int j = i + 1; j <= arr.length; j++) { 
      if (arr[j] < arr[pos]) 
       pos = j; 

      // Swap min (smallest num) to current position on array 
      int min = arr[pos]; 
      arr[pos] = arr[i]; 
      arr[i] = min; 
     } 
     System.out.println("Pass "+pos+" : "+arr); 
    } 
    return arr; 
}