1

I'm trying to code a selection sort using ArrayList. My program requires me to create an array of size 20 and populate it with random integers between 1 and 1000 (no user input or hard code). The output will require displaying the original unsorted list of integers, and displaying each pass of the sorting algorithm on a separate line.

I tried creating a method for the selection sort, so that's where I'm stuck because I'm not sure how to implement the code into my main method.

An example of how I want my output to come out as is shown below (although it only shows 5 integers when I'm trying to do 20):

Unsorted list: 3 68 298 290 1
Pass 1: 1 68 298 290 3
Pass 2: 1 3 298 290 68
Pass 3: 1 3 68 290 298
Pass 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.");
        }
    }
}
}

I'm also having trouble removing the last number from each passing because it's being displayed twice.. have any idea what I should do?

Sorry for the noob-ness of my coding, I'm still trying to understand it.

2 Answers 2

5

I fixed your code, it should work now.

// 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.");
            }
        }
    }
}
Sign up to request clarification or add additional context in comments.

1 Comment

If you find my answer helpful, please mark it as accpeted.
0

Your method doSelectionSort seems ok, but it does the whole sorting. If you want to show each iteration you just need to add a line:

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;
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.