Как отменить SelectionSort для отображения в порядке убывания?

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

public void selectionSort()
{
    int n = data.length;

    for(int index = 0; index < n-1; index++)
    {
        int min_idx = index;
        for(int j = index+1; j < n; j++)
            if (data[j] < data[min_idx])
                min_idx = j;

        int temp = data[min_idx];
        data[min_idx] = data[index];
        data[index] = temp;
    }
}

Возможный дубликат Обратный порядок массива

user7294900 04.11.2018 09:14
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
1
6 757
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

На данный момент я могу думать о двух методах. Я их не пробовал, но попробовать стоит.

  1. Умножьте все числа на -1 и примените исходную сортировку выбора для сортировки по возрастанию. После завершения сортировки умножьте все числа на -1, чтобы получить исходные числа, но теперь они отсортированы в порядке убывания.

  2. Попробуйте изменить условие сравнения если (данные [j] <данные [min_idx])
    к если (данные [j]> = данные [min_idx])

Сообщите мне, если с этими методами возникнут проблемы.

Второй способ отлично сработал! Спасибо за помощь!

Christian De La Rosa 04.11.2018 09:21

Добро пожаловать, @ Christian. Я рада, что он вам помог. Не могли бы вы отметить этот ответ как принятый?

Akhilesh Pandey 04.11.2018 09:29

Вместо того, чтобы выбирать минимальный элемент на каждой итерации, вы должны выбрать максимальный. Все, что вам действительно нужно сделать, это изменить условие < на >, но я также соответствующим образом изменил имена, чтобы упростить понимание кода:

public void selectionSort()
{
    int n = data.length;

    for(int index = 0; index < n-1; index++)
    {
        int max_idx = index; // max_idx instead of min_idx
        for(int j = index+1; j < n; j++)
            if (data[j] > data[min_idx]) // > instead of <
                max_idx = j;

        int temp = data[max_idx];
        data[max_idx] = data[index];
        data[index] = temp;
    }
}

Чтобы решить эту проблему, я бы порекомендовал вам сначала провести рефакторинг вашего кода. Переместите swap и findMin в отдельный метод:

private static int getMin(int[] arr, int from, int to) {
    int min = from;

    for (int j = from; j < to; j++)
        min = arr[j] < arr[min] ? j : min;

    return min;
}

private static void swap(int[] arr, int i, int j) {
    int tmp = arr[i];
    arr[i] = arr[j];
    arr[j] = tmp;
}

Здесь вы, наверное, видите, что реализация сортировки ASC и DESC тривиальна:

public static void selectionSortAsc(int[] arr) {
    for (int i = 0; i < arr.length - 1; i++)
        swap(arr, getMin(arr, i + 1, arr.length), i);
}

public static void selectionSortDesc(int[] arr) {
    for (int i = arr.length - 1; i > 0; i--)
        swap(arr, getMin(arr, 0, i + 1), i);
}
public static class SelectionSort
{
    static int min;
    public static void Sort(int[] data)
    {
        for (int i = 0; i < data.Length; i++)
        {
            for (int j = 0; j < data.Length; j++)
            {
                min = j;
                if (data[i] < data[j])
                    Swap(x: ref data[i], y: ref data[min]);
            }
        }
    }

    private static void Swap(ref int x, ref int y)
    {
        int temp = x;
        x = y;
        y = temp;
    }
}

For Ascending this line   
if (data[i] < data[j])

For Descending this line  
if (data[i] > data[j])

Другие вопросы по теме

Похожие вопросы

Как дать JList идентификатор и имя?
Мне нужна TreeMap, в которой ключ будет идентификатором и значением (будет hasMap в этом имени будет идентификатором, а значения будут деталями отдыха) для всех данных идентификатора?
Как получить доступ к значению свойства в аннотации?
Как установить путь к классам Java в коде Visual Studio (v 1.27.2)?
Android, как я могу проверить, что пользователь вошел в систему или вышел из системы с помощью общих настроек
Неверный тип возвращаемого значения в ссылке на метод: невозможно преобразовать response.core.publisher.Mono <S> в response.core.publisher.Mono <? расширяет R>
Как извлечь поле из API книг Google с помощью GSON и Jsoup
IllegalTransactionStateException Обнаружено предварительно привязанное соединение JDBC при настройке нескольких источников данных
Maven генерирует фактический jar как .jar.original вместо файла .jar
Android Studio не может разрешить ресурсы для пользовательских представлений в предварительном просмотре макета