jueves, 26 de enero de 2012

Búsqueda Binaria y Terciaria en C

Para empezar, os muestro algo sencillito como es realizar una búsqueda binaria y terciaria en un vector por el método de Divide y Vence, el lenguaje empleado para este algoritmo es C. Espero que os sea útil! Como veréis primero hay que introducir el vector y ordenarlo, después en el main comentas el método de búsqueda que quieras emplear y listo!

#include <cstdlib>
#include <iostream>
#define max 100
using namespace std;
void introducirVector(float A[max],int n)
{
 int i;
  for(i=0;i<n;i++)
  {
       cout<<" A["<<i+1<<"]=";
       cin>>A[i];
  }
  cout<<endl;
}
void mostrarVector(float V[max],int n)
{
   int i;
    for(i=0;i<n;i++)
   {
        cout<< V[i]<<"\t";      
   }
   cout<<endl<<endl;
}
//Con este método ordenaremos el vector previamente a la búsqueda//
void ordenarSeleccion(float V[max],int n)
{
   int i,j,k;
   float temp;
    for(i=0;i<n-1;i++)
    {        k=i;         
             temp=V[i];
             for(j=i+1;j<n;j++)
             {   if(V[j]<temp) //Intercambio
                   {  k=j;
                      temp=V[j];
                    }     
             }
             V[k]=V[i] ;
             V[i]=temp;                  
    }
}
//Busqueda de un elemento en el vector//
int  busquedaBinaria(float V[max],int n ,int dato)
{
  int mitad,izq,der;
  izq=0;
  der=n-1;
  while(izq<=der)
    {mitad=(izq+der)/2;//elemento central del vector para dividirlo
    if(dato>V[mitad])        
     izq=mitad+1;
    else if(dato<V[mitad])
    der=mitad-1;
    else return mitad;
     }
  return -1;//En caso de que no se encuentre
}
int  busquedaTerciaria(float V[max],int prim, int n ,int dato)
{
     int izq,der,nterc;
     izq=prim;
     der=n;
     cout<<"0izq vale"<<izq<<endl;
     cout<<"0der vale"<<der<<endl;
     if (izq>=der){
        V[der]=dato;
        return der;
     }
     nterc=(der-izq+1)/3;//dividimos por un tercio
     cout<<"nterc vale"<<nterc<<endl;
     cout<<"dato vale"<<dato<<endl;
     system("pause");
     if(dato==V[nterc]){
      return nterc; }
       else if(dato<V[nterc]){ 
         cout<<"1izq vale"<<izq<<endl;
         cout<<"1der vale"<<der<<endl;         
         busquedaTerciaria(V,izq,nterc,dato);
         }
       else if(dato==V[der-nterc])
         return der-nterc;
       else if(dato<V[der-nterc]){   
         cout<<"2izq vale"<<izq<<endl;
         cout<<"2der vale"<<der<<endl;
         busquedaTerciaria(V,izq+nterc+1,der-nterc-1,dato);
         }
         else
           cout<<"3izq vale"<<izq<<endl;
           cout<<"3der vale"<<der<<endl;
           busquedaTerciaria(V,der-nterc+1,der,dato);
           }
int main(int argc, char *argv[])
{
     float A[max];
     int n,p=0,dato;
     int pos;
     cout<<"Introduce el número de elementos del vector :";
     cin>>n;
     introducirVector(A,n);
     cout<<"El vector introducido es:"<<endl;
     mostrarVector(A,n);
     ordenarSeleccion(A,n);
     cout<<"El vector ordenado:"<<endl;
     mostrarVector(A,n);
     cout<<"Introduzca el número a buscar:";
     cin>>dato;
     pos=busquedaTerciaria(A,1,n,dato);
     //pos=busquedaBinaria(A,n,dato);
     {  if(pos ==-1)
           cout<<"el dato no esta en el vector"<<endl;
        else
        cout<<"El número se encontro en la posicion:"<<pos +1<<endl;
     }
    system("PAUSE");
   return EXIT_SUCCESS;
}

No hay comentarios:

Publicar un comentario