#include <conio.h> #include <iostream.h> #include <stdio.h> /*Las siguientes funciones son el corazón del programa.

La primera inserta los elementos de un array de tal modo que queden como un montículo. La segunda elimina sucesivamente la raiz del montículo */ void insertamonticulo(int *, int N); void eliminamonticulo(int *, int N); int main() { int *array; /*Un vector dinámico*/ int N; cout<<"Introduce el número de datos enteros a ordenar: "; cin>>N; array=new int[N+1]; /*El N+1 es por comodidad. Con eso de que en C++ todos los arreglos empiezan desde 0 y el heapsort presupone que empiezan desde 1, pues ignoro el elemento 0 del array y le aumento un elemento para dar cabida a un indice igual al número de elementos*/ int i; array[0]=-1; /*Una linea que puede omitirse. */ cout<<"\n"; /*El siguiente ciclo pide al usuario los numeros de 1 a N*/ for(i=1;i<=N;i++) { cout<<"Introduce el valor "<<i<<": "; cin>>array[i]; } /*Imprimo los numeros en el orden que ingreso el usuario*/ cout<<"\n Lista ingresada por el usuario:\n"; for(i=1;i<=N;i++) { cout<<array[i]<<" "; } cout<<"\n"; getch();//para pausar /*A continuaci¢n llamo a la función que acomoda los números de tal manera que se respeten las condiciones de un monticulo lineal*/ insertamonticulo(array, N); /*Imprimo el resultado que se manifesto en el vector luego de llamar a la función anterior.*/ cout<<"\nDespues de la funcion que inserta en el monticulo:\n"; for(i=1;i<=N;i++) { cout<<array[i]<<" "; } cout<<"\n"; getch();//para hace pausa /*Y finalmente, se acomodan los números luego de quitarseles sucesivamente la raiz del monticulo*/ eliminamonticulo(array, N);

mayor. int N) { /*Esta función inserta los elementos en un monticulo representado como arreglo. izq. band. k. /*Esta última variable es una bandera que se considera de tipo booleano*/ for (i=2. osea verdadero*/ while (izq<i && band==1) { mayor=A[izq]. ap. } void insertamonticulo(int *A. for(i=1. k=1. i>1. band.cout<<"\n Despues de la funcion que elimina el monticulo:\n". der=3. } cout<<"\n". ap=der. k. A[i]=A[1]. /*1 se considera como verdadero*/ while (k>1 && band==1) { band=0. i--) { aux=A[i]. for (i=N. band=1. aux.i++) { cout<<array[i]<<" ".*/ int i. izq=2. /*El propio lenguaje se encarga de adaptar la parte entera de este tipo de divisiones entre enteros*/ band=1.*/ int i. } } } } void eliminamonticulo(int *A. /*band es 1. A[k/2]=A[k]. getch(). if (mayor<A[der] && der!=i) { mayor=A[der]. } if (aux<mayor) { .i<=N. int N) { /*Esta función elimina la raiz del monticulo en forma repetida.//para hacer pausa return 0. if (A[k]>A[k/2]) { aux=A[k/2]. aux. i<=N. A[k]=aux. ap=izq. k=k/2. i++) { k=i. band=1. der.

} } . } else { band=0. } izq=k*2. } A[k]=aux. k=ap. der=izq+1.A[k]=A[ap].

Sign up to vote on this title
UsefulNot useful