Как изменить сортировку выбором

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

public  void selectionSort(String[ ] data){
    // for each position, from 0 up, find the next smallest item 
    // and swap it into place
    for (int place=0; place<data.length-1; place++){
        int minIndex = place;
        for (int sweep=place+1; sweep<data.length; sweep++){
            if (data[sweep].compareTo(data[minIndex]) < 0)
                minIndex=sweep;
        }
        swap(data, place, minIndex);
    }
}

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

Вся помощь будет оценена по достоинству :)


person Nanda Ardianto    schedule 17.09.2015    source источник
comment
что ты имеешь в виду? в порядке убывания?   -  person Sleiman Jneidi    schedule 17.09.2015
comment
@SleimanJneidi да, в порядке убывания   -  person Nanda Ardianto    schedule 17.09.2015
comment
Верю только переменам - if (data[sweep].compareTo(data[minIndex]) > 0)   -  person Subhrajyoti Majumder    schedule 17.09.2015
comment
@SubhrajyotiMajumder, значит, это не имеет никакого отношения к циклу for?   -  person Nanda Ardianto    schedule 17.09.2015
comment
да, сравнение — ключ к этому.   -  person Subhrajyoti Majumder    schedule 17.09.2015
comment
Порядок убывания такой же, как и порядок возрастания, за исключением того, что вы меняете знак. или поменять местами сравнение вместо a.compateTo(b) > 0 можно сделать b.compareTo(a) > 0 или a.compareTo(b) < 0 или -a.compareTo(b) > 0   -  person Peter Lawrey    schedule 17.09.2015


Ответы (2)


Вам просто нужно отменить метод compareTo

if(data[sweep].compareTo(data[minIndex]) > 0)
    minIndex=sweep;
person Sleiman Jneidi    schedule 17.09.2015
comment
так что это не связано с forloops? - person Nanda Ardianto; 17.09.2015
comment
Нет, все остается по-прежнему, но вместо большего вы используете меньше, чем - person Sleiman Jneidi; 17.09.2015
comment
поэтому проблема, на которую я пытаюсь здесь ответить, заключается в том, что стандартный алгоритм просматривает оставшуюся часть массива в поисках минимального значения, а затем заменяет его на передний план. Измените алгоритм так, чтобы он также искал максимальное значение в оставшейся части и заменял его местами в конце, чтобы он строил отсортированный список с начала и с конца одновременно. Этот метод делает это? @SleimanJneidi - person Nanda Ardianto; 17.09.2015

Сортировка выбором находит наименьший оставшийся элемент в каждой итерации и помещает его в нужное место. Вместо этого вы хотите найти самый большой оставшийся элемент. Самый простой способ сделать это — просто изменить условие выбора. Вместо:

if (data[sweep].compareTo(data[minIndex]) < 0)

Вы должны использовать:

if (data[sweep].compareTo(data[minIndex]) > 0)
person Mureinik    schedule 17.09.2015
comment
О, хорошо, я попробовал, и я думаю, что это работает. Замедляет ли это сортировку неупорядоченного набора, чем при его возрастании? - person Nanda Ardianto; 17.09.2015
comment
У меня есть метод, который проверяет, упорядочен ли массив, и говорит, что это не так? Я действительно смущен - person Nanda Ardianto; 17.09.2015
comment
@NandaArdianto, давайте ограничимся одним вопросом на пост. Пожалуйста, есть новый пост с кодом этого метода? - person Mureinik; 17.09.2015