Сортировка вставками — по убыванию

Извините, если это основной вопрос...

Я просто пытаюсь узнать больше об алгоритмах...

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

Я попытался изменить ключ сравнения (пока (i > 0 && a[i] > key) на (i > 0 && a[i] ‹ key)).. кажется, что он работает частично, но первый элемент не сортируется, Я получаю следующие результаты. Может ли кто-нибудь сообщить мне, где я ошибаюсь?

1 11 10 9 5 4 3 2

public class InsertionSort {
    public static void main(String args[]) {
        int[] a = { 1,10,11,5, 9, 3, 2, 4 };
        // Loop through the entire array length. Consider you already have one
        // element in array, start comparing with
        // first element
        for (int j = 1; j < a.length; j++) {
            // Get the key (The value that needs to be compared with existing
            // values.
            int key = a[j];
            // Get the array index for comparison, we need to compare with all
            // other elements in the array with
            // key
            int i = j - 1;
            // While i > 0 and when key is less than the value in the array
            // shift the value and insert
            // the value appropriately.
            //System.out.println(j);
            while (i > 0 && a[i] < key) {
                a[i + 1] = a[i];
                i = i - 1;
                a[i + 1] = key;
            }
        }
        for (int k = 0; k < a.length; k++) {
            System.out.println(a[k]);
        }
    }
}

person Learner    schedule 08.03.2013    source источник


Ответы (4)


Вы никогда не прикасаетесь к a[0] в

while (i > 0 && a[i] < key) {

поэтому он не отсортирован на свое место. Используйте >= вместо >:

while (i >= 0 && a[i] < key) {

Та же проблема может возникнуть при сортировке по возрастанию.

person Daniel Fischer    schedule 08.03.2013
comment
Извините.. Плохо... мои тестовые данные были плохими, и я не понял, что не касаюсь первого элемента в массиве при выполнении в порядке возрастания.. - person Learner; 08.03.2013
comment
Если я не ошибаюсь, разве строка a[i+1] = key не должна выйти из цикла while? - person Azeem; 14.10.2016
comment
@Azeem Для правильности алгоритма это не имеет значения. Для эффективности вы правы, он должен идти после цикла while, чтобы было меньше записей в массив. - person Daniel Fischer; 14.10.2016
comment
@DanielFischer мой плохой, ты прав. Я не смотрел глубоко, я просто посмотрел и обнаружил, что здесь что-то не так. - person Azeem; 16.10.2016

Первый элемент массива — a[0]. Вы никуда не сравниваете.

person Jim Mischel    schedule 08.03.2013

Начните с 0 с массива a[] для достижения первого элемента a[0]. Итак, первым элементом в a[j] будет a[0], а не a[1];

person javadev    schedule 08.03.2013

person    schedule
comment
Пожалуйста, не публикуйте только код в качестве ответа, но также предоставьте объяснение того, что делает ваш код и как он решает проблему вопроса. Ответы с объяснением, как правило, более качественные и с большей вероятностью привлекут положительные голоса. - person Suraj Kumar; 01.04.2020