Задать вопрос
@rsatarov

Можно ли оптимизировать сортировку?

Нашел специфический алгоритм, называется "Circle Sort". Он сравнивает крайние элементы массива, постепенно доходя до середины, а потом рекурсивно сортирует свои меньшие части. Правда, за раз он не всегда все делает, поэтому нужно пройтись несколько раз. Согласно рекомендации, его можно оптимизировать, если после 0,5 log(n) кругов все добить сортировкой вставками. Скорость, конечно, так себе, но выглядит интересно. Но можно ли из него выжать еще больше, допустим, избавившись от рекурсии? (И сильно ли рекурсия влияет на скорость?)

public void sort(int[] array) {
    int numOfSwaps = 0;

    for (int i = (int) (0.5 * Math.log(array.length)); i >= 0; i--) {
        numOfSwaps = circleSort(array, 0, array.length - 1, 0);
    }

    if (numOfSwaps != 0) {
        for (int i = 1; i < array.length; i++) {
            int temp = array[i];
            int j = i;

            while (j > 0 && array[j - 1] > temp) {
                array[j] = array[j - 1];
                j = j - 1;
            }
            array[j] = temp;
        }
    }
}

private int circleSort(int[] array, int lowerBound, int higherBound, int numOfSwaps) {
    if (lowerBound == higherBound) return numOfSwaps;

    int low = lowerBound;
    int high = higherBound;
    int middle = (higherBound - lowerBound) / 2;

    while (lowerBound < higherBound) {
        if (array[lowerBound] > array[higherBound]) {
            int temp = array[lowerBound];
            array[lowerBound] = array[higherBound];
            array[higherBound] = temp;
            numOfSwaps++;
        }
        lowerBound++;
        higherBound--;
    }

    if (lowerBound == higherBound && array[lowerBound] > array[higherBound + 1]) {
        int temp = array[lowerBound];
        array[lowerBound] = array[higherBound + 1];
        array[higherBound + 1] = temp;
        numOfSwaps++;
    }

    numOfSwaps = circleSort(array, low, low + middle, numOfSwaps);
    numOfSwaps = circleSort(array, low + middle + 1, high, numOfSwaps);

    return numOfSwaps;
}
  • Вопрос задан
  • 243 просмотра
Подписаться 1 Оценить 2 комментария
Помогут разобраться в теме Все курсы
  • Нетология
    Java-разработчик с нуля
    12 месяцев
    Далее
  • Skillbox
    Java-разработчик
    8 месяцев
    Далее
  • ProductStar
    Профессия: Java-разработчик
    9 месяцев
    Далее
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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