java сортировка от самого большого до самого маленького - PullRequest
2 голосов
/ 01 марта 2020

этот класс сортируется от наименьшего к наибольшему числу, как сортировать противоположное (от наибольшего к наименьшему).

Я пытаюсь изменить некоторые символы в divide() и merger(), но это приводит к прекратить работу сортировки.

    public void divide(int startIndex, int endIndex) {
        // Divide till you breakdown your list to single element
        if (startIndex < endIndex && (endIndex - startIndex) >= 1) {
            int mid = (endIndex + startIndex) / 2;
            divide(startIndex, mid);
            divide(mid + 1, endIndex);        

            //merging Sorted array produce above into one sorted array
            merger(startIndex, mid, endIndex);            
        }       
    }   

    public void merger(int startIndex, int midIndex, int endIndex) {
        // Below is the merged array that will be sorted array Array[i - midIndex], Array[(midIndex + 1) - endIndex]
        ArrayList<Integer> mergedSortedArray = new ArrayList<Integer>();

        int leftIndex = startIndex;
        int rightIndex = midIndex + 1;

        while (leftIndex <= midIndex && rightIndex <= endIndex) {
            if (inputArray.get(leftIndex) <= inputArray.get(rightIndex)) {
                mergedSortedArray.add(inputArray.get(leftIndex));
                leftIndex++;
            } else {
                mergedSortedArray.add(inputArray.get(rightIndex));
                rightIndex++;
            }
        }       

        // Either of below while loop will execute
        while (leftIndex <= midIndex) {
            mergedSortedArray.add(inputArray.get(leftIndex));
            leftIndex++;
        }

        while (rightIndex <= endIndex) {
            mergedSortedArray.add(inputArray.get(rightIndex));
            rightIndex++;
        }

        int i = 0;
        int j = startIndex;
        // Setting sorted array to original one
        while (i < mergedSortedArray.size()) {
            inputArray.set(j, mergedSortedArray.get(i++));
            j++;
        }
    }
}

1 Ответ

3 голосов
/ 01 марта 2020

Вам необходимо изменить «операцию сравнения», которая определяет порядок вашего результата:

if(inputArray.get(leftIndex) <= inputArray.get(rightIndex)) {

Сортировка элементов в порядке возрастания. Чтобы (каламбур намеревался) получить обратное, измените сравнение значений; наоборот:

if(inputArray.get(leftIndex) > inputArray.get(rightIndex)) {

Если вы хотите сделать свой алгоритм более модульным, вы можете изменить его интерфейс для принятия экземпляра Comparator<T>, который затем используется для сравнения значений, например,

public void merger(
        int startIndex,
        int midIndex,
        int endIndex,
        Comparator<Integer> comparator) {
    // ...
    if(comparator.compare(inputArray.get(leftIndex), inputArray.get(rightIndex)) < 0) {
    // ...
}

и затем позвоните, например:

merger(start, mid, end, Integer::compareTo); // or even:
merger(start, mid, end, Comparator.naturalOrder());

для подъема; или

Comparator<Integer> comparator = Integer::compareTo;
merger(start, mid, end, comparator.reversed());
// or as one-liner:
merger(start, mid, end, Collections.reverseOrder(Integer::compareTo)); // or even:
merger(start, mid, end, Comparator.reverseOrder());

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

...