Vous êtes sur la page 1sur 11

Algoritmos y Estructura de Datos 2

UPN Cajamarca

Ing. Sistemas

Implementación de Algoritmos de Ordenación y Búsqueda Interna

A continuación presento la implementación de algunos algoritmos de Ordenación y Búsqueda Interna.

Nota: la implementación fue desarrollada en Dev-cpp (http://www.bloodshed.net/dev/devcpp.html).

Se ha hecho uso de archivos cabecera (headers, archivos .h), para cada uno de los algoritmos para un mejor entendimiento. Veamos entonces:

En: burbuja.h

void burbuja_menor(int A[], int N)

{

int aux=0,i=0,j=0;

for(i=1;i<N;i++)

{

for(j=N-1;j>=i;j--)

 

{

 

if(A[j-1]>A[j])

{

 

aux=A[j-1];

A[j-1]=A[j];

A[j]=aux;

 

}

}

}

reportar(A,N);

}

void burbuja_mayor(int A[], int N)

 

{

int aux=0,i=0,j=0;

for(i=N-1;i>0;i--)

 

{

for(j=0;j<i;j++)

 

{

 

if(A[j]>A[j+1])

{

 

aux=A[j];

A[j]=A[j+1];

A[j+1]=aux;

 

}

}

}

reportar(A,N);

}

Ing. Leissi M. Castañeda León

Algoritmos y Estructura de Datos 2

UPN Cajamarca

Ing. Sistemas

void burbuja_con_senal(int A[], int N)

{

 

int aux=0,i=0,j=0; bool band=false;

while((i<=N-1)&& (band==false))

{

band=true;

for(j=0;j<N-1;j++)

 

{

 

if(A[j]>A[j+1])

{

 

aux=A[j];

A[j]=A[j+1];

A[j+1]=aux;

band=false;

 

}

 

}

i++;

}

reportar(A,N);

}

void sacudida(int A[], int N)

{

 

int i=0, izq=1, der=N-1, k=N-1, aux=0;

while(der>=izq)

{

for(i=der;i>=izq;i--)

{

if(A[i-1]>A[i])

{

 

aux=A[i-1];

A[i-1]=A[i];

A[i]=aux;

k=i;

 

}

}

izq=k+1;

for(i=izq;i<=der;i++)

{

if(A[i-1]>A[i])

{

 

aux=A[i-1];

A[i-1]=A[i];

A[i]=aux;

k=i;

 

}

}

der=k-1;

}

reportar(A,N);

}

Ing. Leissi M. Castañeda León

Algoritmos y Estructura de Datos 2

UPN Cajamarca

Ing. Sistemas

En: inserción.h

void insercion_directa(int A[], int N)

{

 

int i=0,aux=0,k=0;

for(i=1;i<=N-1;i++)

{

 

aux=A[i];

k=i-1;

while((k>=0)&&(aux<A[k]))

{

 

A[k+1]=A[k];

k=k-1;

 

}

A[k+1]=aux;

 

}

reportar(A,N);

}

void insercion_binaria(int A[],int N)

{

 

int i=0,aux=0,izq=0,der=0,m=0,j=0;

for(i=1;i<N;i++)

{

aux=A[i];

izq=0;

der=i-1;

while(izq<=der)

{

 

m=(int)((izq+der)/2);

if(aux<=A[m])

der=m-1;

else

izq=m+1;

 

}

j=i-1;

while(j>=izq)

{

 

A[j+1]=A[j];

j=j-1;

 

}

A[izq]=aux;

}

reportar(A,N);

}

Ing. Leissi M. Castañeda León

Algoritmos y Estructura de Datos 2

UPN Cajamarca

Ing. Sistemas

En: selección.h

void seleccion_directa(int A[],int N)

{

 

int i=0, menor=0,k=0,j=0;

for(i=0;i<N-1;i++)

{

menor=A[i];

k=i;

for(j=i+1;j<N;j++)

{

 

if(A[j]<menor)

{

 

menor=A[j];

k=j;

 

}

 

}

A[k]=A[i];

A[i]=menor;

}

reportar(A,N);

}

void shell(int A[],int N)

{

 

int IN=N,i=0,aux=0; bool band;

while(IN>0)

{

IN=(int)(IN/2);

 

band=true;

while(band)

{

 

band=false;

i=0;

while((i+IN)<N)

{

 

if(A[i]>A[i+IN])

{

 

aux=A[i];

A[i]=A[i+IN];

A[i+IN]=aux;

band=true;

 

}

i++;

 

}

 

}

}

reportar(A,N);

}

Ing. Leissi M. Castañeda León

Algoritmos y Estructura de Datos 2

UPN Cajamarca

Ing. Sistemas

En: quicksort.h

//-----------------------------------------------------------

void reduce_recursivo(int A[],int ini, int fin)

{

 

int izq, der,pos,aux; bool band=true; izq=ini; der=fin; pos=ini;

while(band)

{

band=false; while((A[der] > A[pos]) && (pos!=der))

 

der=der-1;

 

if(pos!=der)

{

 

aux=A[pos]; A[pos]=A[der]; A[der]=aux; pos=der; while((A[izq] < A[pos]) && (pos !=izq))

 

izq=izq+1;

 

if(pos!=izq)

{

 

band=true;

aux=A[pos];

A[pos]=A[izq];

A[izq]=aux;

pos=izq;

 

}

 

}

}

if(ini<(pos-1))

reduce_recursivo(A,ini,pos-1);

if((pos+1)<fin)

reduce_recursivo(A,pos+1,fin);

}

void quicksort_recursivo(int A[], int N)

{

 

reduce_recursivo(A,0,N-1);

reportar(A,N);

}

//--------------------------------------------------------

void reduce_iterativo(int A[], int ini, int fin, int pos)

{

int izq=ini, der=fin,aux; pos=ini; bool band=true; while(band)

{

Ing. Leissi M. Castañeda León

Algoritmos y Estructura de Datos 2

UPN Cajamarca

Ing. Sistemas

while((A[der] > A[pos]) && (pos!=der))

 

der=der-1;

if(pos==der)

 

band=false;

else

{

 

aux=A[pos]; A[pos]=A[der]; A[der]=aux; pos=der; while((A[izq] < A[pos]) && (pos!=izq))

izq=izq+1;

if(pos==izq)

band=false;

else

if(pos!=izq)

{

aux=A[pos];

A[pos]=A[izq];

A[izq]=aux;

pos=izq;

}

}

}

}

void quicksort_iterativo(int A[],int N)

{

 

int tope=0, ini, fin, pos; int PILA_MENOR[N], PILA_MAYOR[N];

PILA_MENOR[tope]=0;

PILA_MAYOR[tope]=N-1;

int t=0;

while(tope > -1)

{

ini=PILA_MENOR[tope]; fin=PILA_MAYOR[tope]; pos=ini;

tope=tope-1;

reduce_iterativo(A,ini,fin,pos); if(ini <(pos-1))

{

tope=tope+1;

PILA_MENOR[tope]=ini;

PILA_MAYOR[tope]=(pos-1);

}

if(fin >(pos+1))

{

tope=tope+1;

PILA_MENOR[tope]=(pos+1);

PILA_MAYOR[tope]=fin;

}

}

reportar(A,N);

}

Ing. Leissi M. Castañeda León

Algoritmos y Estructura de Datos 2

UPN Cajamarca

Ing. Sistemas

En: heapsort.h

void inserta_monticulo(int A[], int N)

{

 

int i, k, aux; bool band; for (i=1; i<N; i++)

{

k=i;

band=true; while (k>0 && band==true)

{

 

band=false; if (A[k]>A[(int)(k/2)])

{

 

aux=A[(int)(k/2)];

A[(int)(k/2)]=A[k];

A[k]=aux;

k=(int)(k/2);

band=true;

 

}

 

}

}

}

void elimina_monticulo(int A[], int N)

{

int i, aux, izq, der, k, ap, mayor; bool boolean; for (i=N-1; i>0; i--)

{

aux=A[i];

A[i]=A[0];

izq=1;

der=2;

k=0;

boolean=true; while (izq<i && boolean==true)

{

mayor=A[izq];

ap=izq;

if (mayor<A[der] && der!=i)

{

mayor=A[der];

ap=der;

}

if (aux<mayor)

{

A[k]=A[ap];

k=ap;

}

else

boolean=false;

izq=k*2;

der=izq+1;

Ing. Leissi M. Castañeda León

Algoritmos y Estructura de Datos 2

UPN Cajamarca

Ing. Sistemas

}

}

A[k]=aux;

}

void heapsort(int A[], int N)

{

 

inserta_monticulo(A,N);

reportar(A,N);

elimina_monticulo(A,N);

reportar(A,N);

}

En: búsqueda-interna.h

//Búsqueda Interna

//busqueda secuencial desordenado iterativo void secuencial_desordenado(int A[],int N, int X)

{

int i=0; while((i<N) && (A[i]!=X)) i++;

if(i>N) cout<<"\n La informacion no esta en el arreglo \n";

else

cout<<"\n La informacion se encuentra en la posicion: "<<i<< " \n";

}

//busqueda secuencial desordenado recursivo void secuencial_desordenado_recursivo(int A[],int N, int X,int i)

{

if(i>N) cout<<"\n La informacion no esta en el arreglo \n";

else

{

if(A[i]==X) cout<<"\n La informacion se encuentra en la posicion: "<<i<< " \n";

else

secuencial_desordenado_recursivo(A,N,X,i+1);

}

}

//busqueda secuencial ordenado iterativo

void secuencial_ordenado(int A[],int N, int X)

{

int i=0; while((i<N) && (X > A[i])) i++; if((i>N) || (X < A[i])) cout<<"\n La informacion no esta en el arreglo \n";

else

cout<<"\n La informacion se encuentra en la posicion: "<<i<< " \n";

}

Ing. Leissi M. Castañeda León

Algoritmos y Estructura de Datos 2

UPN Cajamarca

Ing. Sistemas

//busqueda secuencial ordenado recursivo

void secuencial_ordenado_recursivo(int A[],int N, int X,int i)

{

 

if((i<N) && (X > A[i]))

secuencial_ordenado_recursivo(A,N,X,i+1);

else

{

if((i>N) || (X < A[i])) cout<<"\n La informacion no esta en el arreglo \n";

else

cout<<"\n La informacion se encuentra en la posicion: "<<i<< " \n";

}

}

//busqueda binaria

void binaria(int A[], int N, int X)

{

int izq,der,cen; bool band=false;

izq=0; der=N-1; while((izq<=der) && (band==false))

{

cen=((izq+der)/2);

if(X==A[cen])

band=true;

else

{

if(X>A[cen])

izq=cen+1;

else

der=cen-1;

}

}

if(band==true) cout<<"\n La informacion se encuentra en la posicion: "<<cen<< " \n";

else

cout<<"\n La informacion no esta en el arreglo \n";

}

//busqueda binaria sin bandera void binaria_sin_bandera(int A[], int N, int X)

{

 

int izq,der,cen;

izq=0; der=N-1; cen=((izq+der)/2); while((izq<=der) && (X!=A[cen]))

{

if(X>A[cen])

izq=cen+1;

else

der=cen-1;

cen=((izq+der)/2);

}

if(izq>der) cout<<"\n La informacion no esta en el arreglo \n";

else

cout<<"\n La informacion se encuentra en la posicion: "<<cen<< " \n";

}

Ing. Leissi M. Castañeda León

Algoritmos y Estructura de Datos 2

UPN Cajamarca

Ing. Sistemas

//busqueda binaria recursivo

void binaria_recursivo(int A[],int izq, int der, int X)

{

int cen; if(izq>der) cout<<"\n La informacion no esta en el arreglo \n";

else

{

cen=((izq+der)/2);

if(X==A[cen])

cout<<"\n La informacion se encuentra en la posicion:

"<<cen<< " \n"; else

{

 

if(X>A[cen])

binaria_recursivo(A,cen+1,der,X);

else

binaria_recursivo(A,izq,cen-1,X);

}

}

}

Si se han dado cuenta se hace uso de una función reportar, bueno la función la encontramos en: utilidades.h

void reportar(int A[], int n)

{

int i=0;

for(i=0;i<n;i++)

printf(" %d ",A[i]);

printf("\n\n");

}

Bien ahora viene la función principal, donde llamamos a cada uno de los headers creados: main.cpp

#include <cstdlib> #include <iostream>

using namespace std; //para el uso de cout

//archivos headers #include "utilidades.h" #include "burbuja.h" #include "insercion.h" #include "seleccion.h" #include "quicksort.h" #include "heapsort.h"

#include "busqueda-interna.h"

Ing. Leissi M. Castañeda León

Algoritmos y Estructura de Datos 2

UPN Cajamarca

Ing. Sistemas

int main(int argc, char *argv[])

{

 

int N=5;

int A[N];

A[0]=1;

A[1]=2;

A[2]=13;

A[3]=18;

A[4]=19;

reportar(A,N);

//burbuja_menor(A,N);

//burbuja_mayor(A,N);

//burbuja_con_senal(A,N);

//sacudida(A,N);

//insercion_directa(A,N);

//insercion_binaria(A,N);

//seleccion_directa(A,N);

//shell(A,N);

//quicksort_recursivo(A,N);

//quicksort_iterativo(A,N);

//heapsort(A,N);

//secuencial_desordenado(A,N,3);

//binaria_sin_bandera(A,N,19);

binaria_recursivo(A,0,N-1,2);

system("PAUSE"); return EXIT_SUCCESS;

}

Queda por parte del usuario agregar una función para ingresar el tamaño del arreglo y los datos del arreglo, en este caso para modo de prueba se lo ha definido ya.

Ing. Leissi M. Castañeda León