@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;
}
  • Вопрос задан
  • 239 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Bell Integrator Хабаровск
До 400 000 ₽
Bell Integrator Ульяновск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽