/* Binserach - wyszukiwanie binarne */ /* Podstawowe założenie

Transkrypt

/* Binserach - wyszukiwanie binarne */ /* Podstawowe założenie
/* Binserach - wyszukiwanie binarne */
/* Podstawowe załoŜenie: posortowana tablica.*/
/* ZłoŜoność logarytmiczna.*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#define n 10 /*rozmiar tablicy*/
#define Z 41 /*górna granica zakresu danych w tablicy*/
void wypisz(int [], int );
void zatrzymanie(unsigned int);
int bin_search(int [], int , int );
int main(void){
int tab[n]={1,3,5,14,21,24,29,32,36,41};
int x, pom,i;
printf("Testowanie funkcji bin_search...\n");
for(i=1;i<=Z;i++){
wypisz(tab,n);
pom=bin_search(tab,n,i);
zatrzymanie(1);
if(pom!=-1)
printf("\nElement %d znajduje sie pod indeksem: %d.", i, pom);
else
printf("\nElementu %d nie ma w tablicy.", i);
}
fflush(stdin);
printf("\n\nAby zakonczyc nacisnij ENTER.");
getchar();
return 0;
}
void wypisz(int tab[], int rozmiar){
int i;
printf("\n\nTablica:\n\n");
for(i=0;i<n;i++) printf("%d,",tab[i]);
printf("\n");
}
void zatrzymanie(unsigned int CZAS){
const int podzial=10;
double przyrost, start,stop,p=CZAS/podzial;
unsigned int i=0;
printf("\n");
start = clock();
while (przyrost<CZAS){
stop = clock();
przyrost = (double)(stop - start) / CLOCKS_PER_SEC;
if(floor(podzial*przyrost)>=i){
printf(".");
i++;
}
}
printf("\n");
}
int bin_search(int tab[], int rozmiar, int el){
enum {nznal,znal} Stan=nznal;
int lewy=0, prawy=rozmiar-1, srod;
while(lewy<=prawy && !Stan){
srod=(lewy+prawy)/2;
if(tab[srod]==el) Stan=znal;
else if(tab[srod]<el) lewy =srod+1;
else prawy=srod-1;
}
if(Stan==znal) return srod;
else return -1;
}