2017-01-31 28 views
0

我想使用ArrayList編碼選擇排序。我的程序要求我創建一個大小爲20的數組,並用1和1000之間的隨機整數(無用戶輸入或硬編碼)填充它。輸出將需要顯示原始未排序整數列表,並在單獨的行上顯示排序算法的每次通過。選擇排序使用ArrayList

我試着創建一個選擇排序的方法,所以這就是我卡住的地方,因爲我不知道如何將代碼實現到我的主要方法。

的我多麼希望我的輸出出來爲如下所示(儘管它只能說明,當我試圖做20 5點的整數)的一個例子:

未分類的列表:3 68 298 290 1個
通行證1:1 68 298 290 3
通行證2:1 3 298 290 68
通行證3:1 3 68 290 298
通行證4:1 3 68 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; 
}