void construir(Heap heap,int n,int *pos){ //constroi o heap segundo a ordem: int esq= n/2+1; //um elemento na posicao i tem que ser menor que um while (esq>1){ //elemento na posicao 2i e nao posicao 2i+1 esq--; refazer(heap,esq,n,pos); } }
void construir(int *a, int *n,int *copias,int *comparacoes) { int esq = *n/2 + 1; *copias += 1; while (esq > 1) { *comparacoes += 1; esq--; *copias += 1; refazer(esq,*n, a,copias,comparacoes); } }
CelulaHeap retirarmenor(Heap heap,int *n,int *pos){ //retira o elemento na posicao 1 do heap, CelulaHeap minimo; //o troca com a última posicao, decrementa a qtd e refaz o heap. if ((*n)>=1){ minimo=heap[1]; heap[1]=heap[(*n)]; pos[heap[(*n)].vertice]=1; heap[(*n)]=minimo; pos[minimo.vertice]=(*n); (*n)--; refazer(heap,1,*n,pos); } return(minimo); }
void heapsort(int *a, int *n,int *copias,int *comparacoes) { int esq, dir; int x; construir(a, n,copias,comparacoes); /*constroi o heap*/ esq = 1; dir = *n; *copias += 2; while (dir > 1) { /*ordena o vetor*/ *comparacoes += 1; x = a[1]; a[1] = a[dir]; a[dir] = x; dir--; *copias += 4; refazer(esq, dir, a,copias,comparacoes); } }