Posts Tagged BINARY SEARCH

Program of Binary Search in C, using Recursive and Non Recursive functions.

#include <stdio.h>
#define MAX_LEN 10

/* Non-Recursive function*/
void b_search_nonrecursive(int l[],int num,int ele)
{
int l1,i,j, flag = 0;
l1 = 0;
i = num-1;
while(l1 <= i)
{
j = (l1+i)/2;
if( l[j] == ele)
{
printf("\nThe element %d is present at position %d in list\n",ele,j);
flag =1;
break;
}
else
if(l[j] < ele)
l1 = j+1;
else
i = j-1;
}
if( flag == 0)
printf("\nThe element %d is not present in the list\n",ele);
}

/* Recursive function*/
int b_search_recursive(int l[],int arrayStart,int arrayEnd,int a)
{
int m,pos;
if (arrayStart<=arrayEnd)
{
m=(arrayStart+arrayEnd)/2;
if (l[m]==a)
return m;
else if (a<l[m])
return b_search_recursive(l,arrayStart,m-1,a);
else
return b_search_recursive(l,m+1,arrayEnd,a);
}
return -1;
}

void read_list(int l[],int n)
{
int i;
printf("\nEnter the elements:\n");
for(i=0;i<n;i++)
scanf("%d",&l[i]);
}

void print_list(int l[],int n)
{
int i;
for(i=0;i<n;i++)
printf("%d\t",l[i]);
}

/*main function*/
void main()
{
int l[MAX_LEN], num, ele,f,l1,a;
int ch,pos;

clrscr();

printf("======================================================");
printf("\n\t\t\tMENU");
printf("\n=====================================================");
printf("\n[1] Binary Search using Recursion method");
printf("\n[2] Binary Search using Non-Recursion method");
printf("\n\nEnter your Choice:");
scanf("%d",&ch);

if(ch<=2 & ch>0)
{
printf("\nEnter the number of elements : ");
scanf("%d",&num);
read_list(l,num);
printf("\nElements present in the list are:\n\n");
print_list(l,num);
printf("\n\nEnter the element you want to search:\n\n");
scanf("%d",&ele);

switch(ch)
{
case 1:printf("\nRecursive method:\n");
pos=b_search_recursive(l,0,num,ele);
if(pos==-1)
{
printf("Element is not found");
}
else
{
printf("Element is found at %d position",pos);
}
getch();
break;

case 2:printf("\nNon-Recursive method:\n");
b_search_nonrecursive(l,num,ele);
getch();
break;
}
}
getch();
}

, , , ,

1 Comment

Program for all types of Searching in C.

#include<stdio.h>
#include<math.h>
FILE *fp,*fpr;
int i,s[40000],z[40000],a[11];
void func_seque();
void binary();
void interpole();
void ro_interpole();

main()
{
fp=fopen("x.txt","r");
fpr=fopen("y.txt","r");
if(fp==NULL||fpr==NULL)
{
printf("error in opeaning the file\n");
exit(1);
}
for(i=0;i<40000;i++)
{
fscanf(fp,"%d",&s[i]);
fscanf(fpr,"%d",&z[i]);
}
a[0]=0;a[1]=s[99];a[2]=s[199];a[3]=s[499];a[4]=s[999];a[5]=s[1999];a[6]=s[4999];a[7]=s[9999];
a[8]=s[19999];a[9]=s[29999];a[10]=s[39999];

func_seque();
binary();
interpole();
ro_interpole();
}

void func_seque()
{
int i,j,ts[11],t;
printf("\n-----------------------------------------------------------\n");
printf("sequencial search\n");
printf("-----------------------------------------------------------\n");
printf("\tS.no\tvalue\t\tposition\t\ttime\n");
for (i=1;i<11;i++)
{
t=1;
for (j=0;j<40000;j++)
{
if(a[i]==z[j])
{
printf("\t%d\t%d  \t\t%d\t\t%d\n",i,a[i],j+1,t);
ts[i]=t;
break;
}
t++;
}
}
return;
}

void binary()
{
printf("\n-----------------------------------------------------------\n");
printf("binary search\n");
printf("-----------------------------------------------------------\n");
printf("\tS.no\tvalue\t\tposition\t\ttime\n");
int low,high, mid,i,ts[11],t=1;
for(i=1;i<11;i++)
{
low=0;high=39999;t=1;
for (;low<=high;)
{
mid=(low+high)/2;
if(a[i]==z[mid])
{
printf("\t%d\t%d\t\t%d\t\t%d\n",i,a[i],mid+1,t);
ts[i]=t;
break;
}
if( a[i]<z[mid])
high=mid-1;
else
low=mid+1;
t++;
}

}
return;
}

void interpole()
{
printf("\n-----------------------------------------------------------\n");
printf("interpolation search\n");
printf("-----------------------------------------------------------\n");
printf("\tS.no\tvalue\t\tposition\t\ttime\n");
int low,high, mid,i,ts[11],t,band,kband,gap,g,ga;
for(i=1;i<11;i++)
{
low=0;high=39999;t=1;
for (;low<=high;t++)
{
band=z[high]-z[low];
kband=a[i]-z[low];
g=high-low;
ga=g*kband;
gap=(int)(ga/band);
mid=low+gap;
if(a[i]==z[mid])
{
printf("\t%d\t%d\t\t%d\t\t%d\n",i,a[i],mid+1,t);
ts[i]=t;
break;
}
if( a[i]<z[mid])
high=mid-1;
else
low=mid+1;
}

}
return;
}

void ro_interpole()
{
printf("\n-----------------------------------------------------------\n");
printf("robust interpolation search\n");
printf("-----------------------------------------------------------\n");
printf("\tS.no\tvalue\t\tposition\t\ttime\n");

int y,probe,low,high, mid,i,ts[11],t,gap,p,q,r,s,m;
for(i=1;i<11;i++)
{
low=0;high=39999;t=1;
for (;low<=high;)
{
p=z[high]-z[low];
q=a[i]-z[low];
r=high-low;
s=r*q;m=(int)(s/p);
probe=low+m;
gap = (int)(sqrt(high-low+1));
if(gap<=1)
gap=0;
if(probe>=low+gap)
y=probe;
else y=low+gap;
if(high-gap<=y)
mid=high-gap;
else mid=y;
if(a[i]==z[mid])
{
printf("\t%d\t%d\t\t%d\t\t%d\n",i,a[i],mid+1,t);
ts[i]=t;
break;
}
if( a[i]<z[mid])
high=mid-1;
else
low=mid+1;
t++;
}

}
return;
}

, , , , ,

No Comments

PROGRAM TO COMPARE VARIOUS SEARCH TECHNIQUES.

#include<iostream.h>               //HEADER FILES
#include<time.h>
#include<fstream.h>
#include<math.h>

fstream file;
int record[30000],key[20000],valid,found;        //TO STORE DATA
long int comp=0,avgcomp;
float avgtime;

void seqsearch()                     //TO PERFORM SEQUENTIAL SEARCH
{
    comp=found=0;
    int i,j;
    for(i=0;i<valid;i++)
    {
        for(j=0;j<30000;j++)
        {
            if(record[j]==key[i])
            {
                //cout<<"\nfound "<<key[i]<<"  at "<<j;
                found++;
                break;
            }
            //else
            comp++;
        }
        //if(j==30000)
            //cout<<"\n not found**********";
    }
}

void binsearch()                  //TO PERFORM BINARY SEARCH
{
    comp=found=0;
    int top,mid,bot,i;
    for(i=0;i<valid;i++)
    {
        top=0;
        bot=29999;
        mid=(bot+top)/2;
        //cout<<"\n"<<mid;
        while(top<=bot)
        {
            //cout<<"\n"<<mid;
            if(record[mid]==key[i])
            {
                found++;
                comp++;
                //cout<<"\nfound"<<key[i]<<"  at "<<mid;
                break;
            }
            //else
            //{
                comp++;
                if(record[mid]>key[i])
                    bot=mid-1;
                else
                    top=mid+1;
                mid=(bot+top)/2;
            //}
        }
    }
}

void intersearch()         // TO PERFORM INTERPOLATION SEARCH
{
    comp=found=0;
    int top,mid,bot,i;
    for(i=0;i<valid;i++)
    {
        top=0;
        bot=29999;
        if(top!=bot)
            mid=top+(bot-top)*(key[i]-record[top])/(record[bot]-record[top]);
        while(bot-top>0)
        {
            if(record[mid]==key[i])
            {
                //cout<<"\nfound"<<key[i];
                comp++;
                found++;
                break;
            }
            else
            {
                comp++;
                if(top==mid||bot==mid)
                {
                    if(record[mid+1]==key[i])
                    {
                        found++;
                        //cout<<"\nfound"<<key[i];
                    }
                    //else
                    //    cout<<"\n notfound*******";
                    break;
                }
                if(record[mid]>key[i]&&bot!=mid)
                    bot=mid;
                else if(record[mid]<key[i]&&top!=mid)
                    top=mid;
                if(top!=bot)
                    mid=top+(bot-top)*(key[i]-record[top])/(record[bot]-record[top]);
            }
        }
    }
}

void robintersearch()   //TO PERFORM ROBUST INTERPOLATION SEARCH
{
    int top,bot,mid,min,max,position=0,k;
    int gap,probe;
    comp=found=0;
    for(k=0;k<valid;k++)
    {
        bot=29999;
        top=0;
        gap=sqrt(bot-top+1);
        while(top<bot)
        {
            probe=top+(bot-top)*((key[k]-record[top])/(record[bot]-record[top]));
            max=(probe>(top+gap))?probe:(top+gap);
            min=(bot-gap);
            mid=(min<max)?min:max;
            //cout<<"\n"<<probe<<"   "<<mid<<"          "<<min<<"         "<<max<<"           "<<top<<"           "<<bot;
            //comp=comp+2;
            if(mid>bot||mid<top)
            {
                //cout<<"\n not found!!!!!!!!!!!!!!!!!!!!!!";
                //comp++;
                break;
            }
            //comp++;
            if(key[k]==record[mid])
            {
                //cout<<"found "<<key[k]<<" at "<<mid<<endl;
                found++;
                comp++;
                break;
            }
            if(key[k]==record[mid-1])
                {
                    //cout<<"found "<<key[k]<<" at "<<mid-1<<endl;
                    found++;
                    break;
            }
            if(key[k]==record[mid+1])
                {
                    //cout<<"found "<<key[k]<<" at "<<mid+1<<endl;
                    found++;
                    break;
            }
            if((mid-top)<(bot-mid))
            {
                comp++;
                if(key[k]<record[mid])
                {
                    bot=mid-1;
                    gap=sqrt(bot-top+1);
                }
                else
                {
                    top=mid+1;
                    gap=2*gap;
                    if(gap>((bot-top)/2))
                        gap=(bot-top)/2;
                }               //end of if
            }
            else
            {
                comp++;

                if(key[k]>record[mid])
                {
                    top=mid+1;
                    gap=sqrt(bot-top+1);
                }
                else
                {
                    gap=2*gap;
                    bot=mid-1;
                if(gap>((bot-top)/2))
                        gap=(bot-top)/2;
                }              //end of if
            }                 // end of if
        }
    }
}

void main()                            //EXECUTION STARTS HERE
{
    int i,j,k;
    cout<<" \n\n     WAIT........................";
    file.open("records.txt",ios::in);
    for(i=0;i<30000;i++)              //READING DATA
        file>>record[i];
    file.close();

    file.open("keys.txt",ios::in);
    for(i=0;i<20000;i++)              //READING KEYS TO BE SEARCHED
        file>>key[i];
    file.close();

    file.open("sequence.txt",ios::out);   //SEQUENTIAL SEARCH
    long p,q;
    for(k=1;k<=200;k++)
    {
    valid=100*k;
    p=clock();
    seqsearch();
    q=clock();
    avgtime=(float)(q-p)/valid;
    avgcomp=comp/valid;
    file<<avgtime*1000<<"\t"<<avgcomp<<"\n";
    }
    file.close();

    file.open("binary.txt",ios::out);       //BINARY SEARCH
    for(k=1;k<=200;k++)
    {
    valid=100*k;
    p=clock();
    for(j=0;j<100;j++)
        binsearch();
    q=clock();
    avgtime=(float)(q-p)/valid/100;
    avgcomp=comp/valid;
    file<<avgtime*1000<<"\t"<<avgcomp<<"\n";
    }
    file.close();

    file.open("inter.txt",ios::out);       //INTERPOLATION SEARCH
    for(k=1;k<=200;k++)
    {
    valid=100*k;
    p=clock();
    for(j=0;j<1000;j++)
        intersearch();
    q=clock();
    avgtime=(float)(q-p)/valid/1000;
    avgcomp=comp/valid;
    file<<avgtime*1000<<"\t"<<avgcomp<<"\n";
    }
    file.close();

    file.open("robinter.txt",ios::out);     //ROBUST INTERPOLATION SEARCH
    for(k=1;k<=200;k++)
    {
    valid=100*k;
    p=clock();
    for(j=0;j<100;j++)
        robintersearch();
    q=clock();
    avgtime=(float)(q-p)/valid/100;
    avgcomp=comp/valid;
    file<<avgtime*1000<<"\t"<<avgcomp<<"\n";
    }
    file.close();

}

, , , , ,

No Comments