Как реализовать сортировку по убыванию в Java? - PullRequest
0 голосов
/ 17 сентября 2018

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

public static void newSortMethod(int[]a){
    for(int i = 0; i < a.length-1; i++){
        int maxPosition=i;
        int minPosition=i;
        for(int j = i+1; j < a.length; j++){
            if(a[j] < a[minPosition]){
                minPosition = j;
            }
            if(a[j] > a[maxPosition]){
                maxPosition = j;
            }
        }
        swap(a,maxPosition,i);
        swap(a,minPosition,a.length-i-1);
    }
    System.out.println();
}

public static void swap(int[]a, int i, int j){
    int temp = a[i];
    a[i] = a[j];
    a[j] = temp;
}

public static void main(String[] args) {
    int[] a = {2,6,3,9,5,4,8,7,0,13,-3,1};
    newSortMethod(a);
}

вот вывод программы пока -3 8 2 9 13 5 4 6 3 1 7 0

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Ошибки

Прежде всего, давайте посмотрим на проблемы в вашем коде.Есть несколько, что часто случается в программировании.

  • Ваш код все еще пытается отсортировать по возрастанию с swap(a,minPosition,i), а затем пытается поставить максимальное значение в конце, а это не то, чтоВы хотите: вы хотите поместить максимальные значения в начале.
  • Ваш n никогда не изменяется, поэтому вы будете продолжать печатать 0.

Пример решения

Теперь давайте посмотрим, что работает.Я не совсем уверен, как выглядела ваша сортировка по возрастанию , но я думаю, что она должна выглядеть примерно так:

public static void ascendingSortMethod(int[]a){
    int n = 0; // this is only to count how many times the swap method was called
    for(int i = 0; i < a.length-1; i++){
        int minPosition = i;
        for(int j = i+1; j < a.length; j++){
            if(a[j] < a[minPosition]){
                minPosition = j;
            }
        }
        if(minPosition != i){ // check whether swap is necessary
            swap(a,minPosition,i);
            n ++;
        }
    }
    System.out.println(n);
}

Чтобы сделать сортировку по убыванию, просто переключитеоператор сравнения (и, возможно, идентификатор minPosition для ясности).

public static void newSortMethod(int[]a){
    int n = 0; // this is only to count how many times the swap method was called
    for(int i = 0; i < a.length-1; i++){
        int maxPosition = i;
        for(int j = i+1; j < a.length; j++){
            if(a[j] > a[maxPosition]){ // switched comparison operator
                maxPosition = j;
            }
        }
        if(maxPosition != i){ // check whether swap is necessary
            swap(a,maxPosition,i);
            n ++;
        }
    }
    System.out.println(n);
}
0 голосов
/ 17 сентября 2018

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

public static void newSortMethod(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;
            }
        }
        swap(a,maxPosition,i);
        swap(a,minPosition,a.length-i-1);
    }
}

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

public static void newSortMethod(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;
            }
        }
        swap(a,minPosition,maxPosition); // <-- this line
        swap(a,maxPosition,i);
        swap(a,minPosition,a.length-i-1);
    }
}
...