Выбор сортировки по убыванию - JAVA - PullRequest
0 голосов
/ 01 декабря 2019

У меня реализована сортировка выбора для сортировки массива случайных целых чисел. Я хотел бы, чтобы пользователь выбирал между возрастающим или убывающим порядком. Сортировка по возрастанию работает безупречно, а по убыванию - нет. Вот как выглядит моя сортировка выбора:

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

Я видел несколько вопросов, похожих на мои, хотя ни на один из вопросов, которые я видел, не была настроена их сортировка выбора, поэтому я не смог реализоватьих решения.

1 Ответ

0 голосов
/ 01 декабря 2019

Во-первых, блоки if должны сравниваться с minPosition и maxPosition, а не i. Во-вторых, если вы выбираете и minimum, и maximum, то ваш внутренний цикл for должен остановиться на a.length - i, а не a.length (так как верхние элементы i также отсортированы). Выполнение обоих дает вам это как алгоритм возрастания.

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

Чтобы переключиться в порядке убывания, просто добавьте одну строку.

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

Используйте swap функцию https://www.geeksforgeeks.org/collections-swap-method-in-java-with-examples/

...