heapsort ввод с наибольшим и наименьшим количеством сравнений

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

Мне интересно, повлияет ли и как порядок ввода в алгоритм heapsort на количество сравнений, необходимых для сортировки ввода. Например, возьмем алгоритм пирамидальной сортировки, который сортирует в порядке возрастания (от меньшего к большему).... если я ввожу набор целых чисел, уже упорядоченных таким образом (по возрастанию), сколько сравнений потребуется по сравнению с набором входных данных, который в порядке убывания (от большего к меньшему)? Как насчет сравнения с полностью рандомизированным набором тех же чисел?

public class Heap {
    // This class should not be instantiated.
    private Heap() {
    }

    /**
     * Rearranges the array in ascending order, using the natural order.
     * 
     * @param pq
     *            the array to be sorted
     */
    public static void sort(Comparable[] pq) {
        int N = pq.length;
        for (int k = N / 2; k >= 1; k--)
            sink(pq, k, N);
        while (N > 1) {
            exch(pq, 1, N--);
            sink(pq, 1, N);
        }
    }

    private static void sink(Comparable[] pq, int k, int N) {
        while (2 * k <= N) {
            int j = 2 * k;
            if (j < N && less(pq, j, j + 1))
                j++;
            if (!less(pq, k, j))
                break;
            exch(pq, k, j);
            k = j;
        }
    }

    private static boolean less(Comparable[] pq, int i, int j) {
        return pq[i - 1].compareTo(pq[j - 1]) < 0;
    }

    private static void exch(Object[] pq, int i, int j) {
        Object swap = pq[i - 1];
        pq[i - 1] = pq[j - 1];
        pq[j - 1] = swap;
    }

    // is v < w ?
    private static boolean less(Comparable v, Comparable w) {
        return (v.compareTo(w) < 0);
    }
}

person user3245237    schedule 25.02.2014    source источник
comment
Мы могли бы дать ответ, но я считаю, что для изучения алгоритма лучше всего пройтись по нему самостоятельно с набором чисел с ручкой/бумагой. Обычно SO больше подходит для определенной части проблемы, на которой вы застряли, показывая, что вы уже пробовали.   -  person C.B.    schedule 25.02.2014
comment
Я работал над этим, просто используя модифицированный алгоритм пирамидальной сортировки, но мои результаты не кажутся правильными... и я даже не уверен, как я могу их объяснить. Я пришел к выводу, что кажется, что входные данные, которые уже идеально упорядочены по возрастанию ИЛИ по убыванию, имеют одинаковое, наименьшее количество возможных сравнений ... это просто не кажется правильным, хотя   -  person user3245237    schedule 25.02.2014
comment
Таким образом (обычно) heapsort проходит через алгоритм Build-Max-Heap перед входом в HeapSort. Можете ли вы показать свой алгоритм Build-Max-Heap?   -  person C.B.    schedule 25.02.2014
comment
Я только что отредактировал исходный пост и включил полный алгоритм пирамидальной сортировки.   -  person user3245237    schedule 25.02.2014


Ответы (1)


Сортировка кучей отличается от пузырьковой сортировки и быстрой сортировки, лучшие и худшие случаи не будут происходить, когда входные элементы упорядочены по убыванию/возрастанию. Первым шагом сортировки кучи является построение кучи (max-heap в целом), что может быть выполнено за линейное время O(n) с использованием "просеивания" версии heapify, независимо от того, в каком порядке находятся начальные элементы. . Если входные данные уже представляют собой кучу, это просто экономит время на обмен.
Обычно считается, что наилучшая и наихудшая производительность в обоих случаях — это O(nlogn)(элемент сортировки кучи на вики говорит, что в лучшем случае производительность может быть Ω(n), и об этом есть ссылка), но В нотации big-O опущены постоянные множители и члены более низкого порядка, поэтому они эквивалентны в нотации big-O, но могут различаться на постоянный множитель.

Например, я получаю все 720 перестановок заданных элементов: {1,2,3,4,5,6} и сортирую их с помощью вашего кода, минимальное/максимальное количество сравнений - 12/17, а порядок - {6 ,1,4,2,3,5}/{1,4,2,5,6,3} соответственно. А минимальное/максимальное количество обменов – 8/15, а порядок – {6,3,5,1,2,4}/{1,2,3,5,4,6} соответственно. Мой другой post — это максимальное количество обменов.

person jfly    schedule 26.02.2014