简体   繁体   中英

Selection sort in descending order - JAVA

I have a selection sort implemented to sort an array of random integers. I would like the user to choose between ascending or descending order. The ascending sort works flawlessly, although descending does not. Here is what my selection sort looks like:

public String selection(int[] array,int num,String order) {
    String output = "";
    int min;
    // This is the descending selection sort
    if (order == "desc") {
        for (int i = num - 1; i >= 0; i--) {
            // Assume first element is min
            min = i;
            for (int j = i + 1; j < num; j++) {
                if (array[j] < array[min]) {
                    min = j;

                }
            }
            if (min != i) {
                final int temp = array[i];
                array[i] = array[min];
                array[min] = temp;
            }
            output = output + Integer.toString(array[i]) + "\n";
        }
    } // This is the ascending selection sort 
    else {
        for (int i = 0; i < num; i++) {
            // Assume first element is min
            min = i;
            for (int j = i + 1; j < num; j++) {
                if (array[j] < array[min]) {
                    min = j;

                }
            }
            if (min != i) {
                final int temp = array[i];
                array[i] = array[min];
                array[min] = temp;
            }
            output = output + Integer.toString(array[i]) + "\n";
        }
    }
    return(output.trim());
}

I've seen a few questions similar to mine, although none of the questions I saw had their selection sort set up like this so I was unable to implement their solutions.

Firstly, the if blocks should compare to minPosition and maxPosition , not i . Secondly, if you are selecting both minimum and maximum , then your inner for loop should stop at a.length - i , not a.length (since the top i elements are also sorted). Doing both gives you this as the ascending order algorithm.

public static void SortAscending(int[] a){
    for(int i = 0; i < a.length; i++){
        int maxPosition=i;
        int minPosition=i;
        for(int j = i+1; j < a.length - i; j++){
            if(a[j] < a[minPosition]){
                minPosition = j;
            }
            if(a[j] > a[maxPosition]){
                maxPosition = j;
            }
        }
        /*
        if(i < a.length/2-1)
        */
        swap(a,maxPosition,i);
        swap(a,minPosition,a.length-i-1);
    }
}

To switch to descending order, simply add one line.

public static void SortDescending(int[] a){
    for(int i = 0; i < a.length; i++){
        int maxPosition=i;
        int minPosition=i;
        for(int j = i+1; j < a.length - i; j++){
            if(a[j] < a[minPosition]){
                minPosition = j;
            }
            if(a[j] > a[maxPosition]){
                maxPosition = j;
            }
        }
        /*
        if(i < a.length/2-1)
        */
        swap(a,minPosition,maxPosition); // <-- this line
        swap(a,maxPosition,i);
        swap(a,minPosition,a.length-i-1);
    }
}

Use swap function https://www.geeksforgeeks.org/collections-swap-method-in-java-with-examples/

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM