aeds2/fonte/u03 Ordenação em memória pr.../c/heapsort.c

57 lines
1.6 KiB
C

#include "heapsort.h"
//=============================================================================
void construir(int *array, int tamHeap){
for(int i = tamHeap; i > 1 && array[i] > array[i/2]; i /= 2){
swap(array + i, array + i/2);
}
}
//=============================================================================
int getMaiorFilho(int *array, int i, int tamHeap){
int filho;
if (2*i == tamHeap || array[2*i] > array[2*i+1]){
filho = 2*i;
} else {
filho = 2*i + 1;
}
return filho;
}
//=============================================================================
void reconstruir(int *array, int tamHeap){
int i = 1;
while(i <= (tamHeap/2)){
int filho = getMaiorFilho(array, i, tamHeap);
if(array[i] < array[filho]){
swap(array + i, array + filho);
i = filho;
}else{
i = tamHeap;
}
}
}
//=============================================================================
void heapsort(int *array, int n) {
//Alterar o vetor ignorando a posicao zero
int arrayTmp[n+1];
for(int i = 0; i < n; i++){
arrayTmp[i+1] = array[i];
}
//Contrucao do heap
for(int tamHeap = 2; tamHeap <= n; tamHeap++){
construir(arrayTmp, tamHeap);
}
//Ordenacao propriamente dita
int tamHeap = n;
while(tamHeap > 1){
swap(arrayTmp + 1, arrayTmp + tamHeap--);
reconstruir(arrayTmp, tamHeap);
}
//Alterar o vetor para voltar a posicao zero
for(int i = 0; i < n; i++){
array[i] = arrayTmp[i+1];
}
}
//=============================================================================