Temos a seguir alguns métodos que são compartilhados entre os dois métodos principais:

O método que inicializa a lista é o setData, que copia a lista original em um atributo da classe. A seguir apresentamos o código completo incluindo a função Main com os dados de teste.

Exemplo 1_3_7: exemplo de busca heapSort.

public class Heap {
    private int[] heap;
    private int[] sortedList;
/**
 *  inicializa a lista de dados a serem ordenados
 * @param data lista de dados
 */
    public void setData(int[] data) {
        heap = new int[data.length];
        sortedList = new int[data.length];
        for (int i = 0; i < data.length; i++) {
            heap[i] = data[i];
        }
    }

    /**
   * ordena os elementos de uma lista
   * 
   * @param não
   *            recebe parâmetros
   * @return retorna a lista ordenada
   */
    public int[] sort() {
        construct(); // implementa o Heap
        extract(); // Extrai o maior valor do Heap
        return sortedList;
    }

    /**
   * constroi o Heap
   * 
   * @param não possui parâmetros
   * @return não possui valor de retorno
   */
    private void construct() {
        int current, maxChildIndex;
        boolean done;
        for (int i = (heap.length - 2) / 2; i >= 0; i--) {
            current = i;
            done = false;
            while (!done) {// constroi o heap
                // com o nó no índice i
                if (2 * current + 1 > heap.length - 1) {
                    // o nó atual não tem filho, então pára
                    done = true;
                } else {
                    // o nó atual tem pelo menos um nó filho
                    // busca o índice do maior filho
                    maxChildIndex = maxChild(current, heap.length - 1);
                    if (heap[current] < heap[maxChildIndex]) {
                        // o nó filho é maior, então troca e continua
                        swap(current, maxChildIndex);
                        current = maxChildIndex;
                    } else { // se todos os nós tiverem a condição 
                        // de valor satisfeita então para
                        done = true;
                    }
                }
            }
            assert isValidHeap(heap, i, heap.length - 1) : "Error: Construction phase is not working "
                    + "correctly";
        }
        testPrint(heap.length); // TEMP
    }

    /**
   * Extrai os valores do Heap
   * 
   * @param não possui parâmetros
   * @return não possui valor de retorno
   */
    private void extract() {
        int current, maxChildIndex;
        boolean done;
        for (int size = heap.length - 1; size >= 0; size--) {
            // remove o nó raiz
            sortedList[size] = heap[0];
            // move o último nó para o nó raiz
            heap[0] = heap[size];
            // reconstroi o heap com menos um elemento
            current = 0;
            done = false;
            while (!done) {
                if (2 * current + 1 > size) {
                    // o nó atual não tem nó filho, então pára.
                    done = true;
                } else {
                    // o nó atual tem pelo menos um nó filho
                    // busca o índice do maior filho
                    maxChildIndex = maxChild(current, size);
                    if (heap[current] < heap[maxChildIndex]) {
                        // se o filho for maior então troca e continua
                        swap(current, maxChildIndex);
                        current = maxChildIndex;
                    } else { // se todos os nós tiverem a condição 
                        // de valor satisfeita então para
                        done = true;
                    }
                }
            }
            testPrint(size); // TEMP
        }
    }
    /**
   * calcula o índice do maior nó filho
   * @param location índice do nó pai
   * @param end maior índice da lista
   * @return índice do maior nó filho
   */
    private int maxChild(int location, int end) {
        int result, leftChildIndex, rightChildIndex;
        rightChildIndex = 2 * location + 2;
        leftChildIndex = 2 * location + 1;

        assert leftChildIndex <= end : "Error: node at position " + location
                + "has no children.";
        if (rightChildIndex <= end
                && heap[leftChildIndex] < heap[rightChildIndex]) {
            result = rightChildIndex;
        } else {
            result = leftChildIndex;
        }
        return result;
    }
/**
 * Verificar se o heap obtido é válido
 * @param heap conjunto de valores do heap
 * @param start índice do primeiro nó 
 * @param end índice do último nó.
 * @return
 */
    private boolean isValidHeap(int[] heap, int start, int end) {
        for (int i = start; i < end / 2; i++) {
            if (heap[i] < Math.max(heap[2 * i + 1], heap[2 * i + 2])) {
                return false;
            }
        }
        return true;
    }
/**
 * Troca a posição de dois elementos
 * @param loc1 índice do primeiro elemento
 * @param loc2 índice do segundo elemento
 */
    private void swap(int loc1, int loc2) {
        int temp;
        temp = heap[loc1];
        heap[loc1] = heap[loc2];
        heap[loc2] = temp;
    }
/**
 * Imprime todos os valores
 * @param limit maior índice
 */
    private void testPrint(int limit) {
        for (int i = 0; i < limit; i++) {
            System.out.print(" " + heap[i]);
        }
        System.out.println(" ");
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] number = { 90, 44, 84, 12, 77, 23, 38, 5, 17 };
        int[] sortedList;
        Heap heap = new Heap();
        heap.setData(number); // assign the original list
        sortedList = heap.sort();// sort the list
        for (int i = 0; i < sortedList.length; i++) { // print out
            System.out.print(" " + sortedList[i]); // the sorted
        }

    }
}
Copyright © 2014 AIEC.