57 lines
1.6 KiB
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];
|
|
}
|
|
}
|
|
//=============================================================================
|