Pular para conteúdo

Heap Sort

O Heap sort constrói um max-heap e move repetidamente sua raiz máxima para o final do prefixo ainda não ordenado.

static void heapSort(int[] values) {
    for (int root = values.length / 2 - 1; root >= 0; root--) {
        siftDown(values, root, values.length);
    }
    for (int end = values.length - 1; end > 0; end--) {
        swap(values, 0, end);
        siftDown(values, 0, end);
    }
}

private static void siftDown(int[] values, int root, int size) {
    while (2 * root + 1 < size) {
        int child = 2 * root + 1;
        if (child + 1 < size && values[child + 1] > values[child]) child++;
        if (values[root] >= values[child]) return;
        swap(values, root, child);
        root = child;
    }
}

private static void swap(int[] values, int a, int b) {
    int temporary = values[a];
    values[a] = values[b];
    values[b] = temporary;
}

A construção bottom-up do heap é Θ(n). As n - 1 remoções custam O(log n) cada; portanto, o tempo total é Θ(n log n) em todos os casos. Esta implementação usa espaço auxiliar Θ(1) e não é estável. O Heap sort oferece um limite forte de pior caso, mas em geral possui localidade menos favorável que um QuickSort bem implementado.