Algorytmy wyszukiwania oraz wyznaczenie iteracji

0

Witajcie, jestem studentem informatyki i mam problem ze znalezieniem błędu w kodzie. Moim zadaniem jest stworzenie tabelki, która ma posiadać liczbę iteracji dla trzech rozkładów: równomiernego, kwadratu równomiernego i dla rozkładu normalnego, dla każdego z trzech algorytmów wyszukiwania ( liniowe, binarne i interpolacyjne ). Prosiłbym o pomoc w znalezieniu błędu w kodzie, który dodaję poniżej. Pozdrawiam :)

#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <time.h>
#include <fstream>
#include <math.h>

using namespace std;

int licznik1,licznik2,licznik3;

    void losuj_tablice(int *tab, int N)
    {
     for (int i=0; i<N; i++)
     {
     tab[i]=rand()%100;   // odpowiada za losowanie losowych elementow z tablicy
     
     }
    }
    void kwadrat_rownomierny(int *tab, int N)
    {
    	for (int i=0; i<N; i++)
    	{
    	int k;
		k = (rand() % 100);
		tab[i] = pow(k,2);
		}
	}
	 void rozklad_normalny(int *tab, int N)
    {
    	for (int i=0; i<N; i++)
    	{
    	tab[i] = rand() % 100 + rand() % 100;
		}
	}
    
    void drukuj_tablice(int *tab,int N)
    {
      for (int i=0;i<N;i++)
      {
          cout<<tab[i]<<endl;  // wyswietla wylosowane liczby z tablicy
      }
    }
    void sortowanie_babelkowe(int *tab,int N)
    {
      cout<<endl;

      for (int i=0;i<N;i++) //petla zewnetrzna
      {
        for (int j=0;j<N-1-i;j++) // petla wewnetrzna ktora oblicza ktora liczba jest mniejsza
          {
            if(tab[j]>tab[j+1])  // warunek charakteryzujacy sortowanie babelkowe
            {
               int bufor;
               bufor=tab[j+1];
               tab[j+1]=tab[j];
               tab[j]=bufor;
            }
          }
      }
    }

    int wyszukiwanie_liniowe(int *tab, int N, int q)
    {
     for(int i=0;i<N;i++)
	     {
	 	   if(tab[i]==q) // jezeli tab[i] jest rowna wartosci q okreslonej w int main
	 	   {
	 	    cout<<tab[i]<<endl;  // to wyswietlony zostanie zbior tej tablicy
	 	    
		   }
			licznik1++;	
		 }

	}

     int wyszukiwanie_binarne(int *tab, int l, int r, int q)  // zmienna l to lewa strona tablicy a r to prawa, q przechowuje numer środkowego elementu tablicy
     {

		int m=3;    // 3 liczba z tablicy posortowanej
     	m=((l+r)/2);   // pozwala wyznaczyc srodkowowy element z tablicy czyli l=0,r=7 bo N=7, zatem 0+7/2 daje nam m=3
		licznik2++;
		
     	if(tab[m]==q)  // jezeli wartosc z rownania m jest rowna wartosci q to zwracane jest m
     	{
     		return m;
     		
		 }


        if(tab[m]<q)  // jezeli m element tablicy jest mniejszy od q to zwracane jest wyszukiwanie binarne
        {
        return wyszukiwanie_binarne(tab,m+1,r,q);
		}

		if(tab[m]>q)
		{
		return wyszukiwanie_binarne(tab,l,m-1,q);
		}

     	if (r-l<1)
     	{
     		return -1;
     		
		 }
		
	 }
	 
 int wyszukiwanie_interpolacyjne(int *tab, int l, int r, int q)
     {

     	int m=l+(r-l)/((tab[r]-tab[1])*(q-tab[1]));
		licznik3++;

     	if(tab[m]==q)
     	{
     		return m;
     		
		 }


        if(tab[m]<q)
        {
        return wyszukiwanie_interpolacyjne(tab,m+1,r,q);
		}

		if(tab[m]>q)
		{
		return wyszukiwanie_interpolacyjne(tab,l,m-1,q);
		}

     	if (r-l<1)
     	{
     		return -1;
		 }
		 
     }



    int main()
    {
     int N=7, q=34, tab[N], l=0, r=N-1,m;

	 cout<<"--------------------------"<<endl;
	 cout<<"Rozklad rownomierny"<<endl;
     losuj_tablice(tab,N);
     sortowanie_babelkowe(tab,N);
     drukuj_tablice(tab,N);
     sortowanie_babelkowe(tab,N);
     wyszukiwanie_liniowe(tab,N,q);
     cout<<"licznik dla liniowego:"<<licznik1<<endl;
     cout<<endl;
	 wyszukiwanie_binarne(tab,0,N-1,q);
	 cout<<wyszukiwanie_binarne(tab,0,N-1,q)<<endl;
	 cout<<"licznik dla binarnego:"<<licznik2<<endl;
     cout<<endl;
     wyszukiwanie_interpolacyjne(tab,0,N-1,q);
     cout<<wyszukiwanie_interpolacyjne(tab,l,r,q)<<endl;
	 cout<<"licznik dla intepolacyjnego:"<<licznik3<<endl;
	 
	 cout<<"--------------------------"<<endl;
	 cout<<"Kwadrat rownomierny"<<endl;
	 kwadrat_rownomierny(tab,N);
     sortowanie_babelkowe(tab,N);
     drukuj_tablice(tab,N);
     sortowanie_babelkowe(tab,N);
     wyszukiwanie_liniowe(tab,N,q);
     cout<<"licznik dla liniowego:"<<licznik1<<endl;
     cout<<endl;
	 wyszukiwanie_binarne(tab,0,N-1,q);
	 cout<<wyszukiwanie_binarne(tab,0,N-1,q)<<endl;
	 cout<<"licznik dla binarnego:"<<licznik2<<endl;
     cout<<endl;
     wyszukiwanie_interpolacyjne(tab,0,N-1,q);
     cout<<wyszukiwanie_interpolacyjne(tab,l,r,q)<<endl;
	 cout<<"licznik dla intepolacyjnego:"<<licznik3<<endl;
     
     cout<<"--------------------------"<<endl;
     cout<<"Rozklad normalny"<<endl;
     rozklad_normalny(tab,N);
     sortowanie_babelkowe(tab,N);
     drukuj_tablice(tab,N);
     sortowanie_babelkowe(tab,N);
     wyszukiwanie_liniowe(tab,N,q);
     cout<<"licznik dla liniowego:"<<licznik1<<endl;
     cout<<endl;
	 wyszukiwanie_binarne(tab,0,N-1,q);
	 cout<<wyszukiwanie_binarne(tab,0,N-1,q)<<endl;
	 cout<<"licznik dla binarnego:"<<licznik2<<endl;
     cout<<endl;
     wyszukiwanie_interpolacyjne(tab,0,N-1,q);
     cout<<wyszukiwanie_interpolacyjne(tab,l,r,q)<<endl;
	 cout<<"licznik dla intepolacyjnego:"<<licznik3<<endl;
     
    system("PAUSE");
    return 0;

	}
0
  1. Zapoznaj się z pojęciem formatowania kodu: http://4programmers.net/Forum/998482 widać że IDE próbuje cię wspomóc zaś ty z nim walczysz
  2. Zapoznaj się z inkrementacją bo jej nie rozumiesz: http://4programmers.net/Forum/1101404
  3. Nie używaj innego niż angielskie nazewnictwo: http://4programmers.net/Forum/1208091
  4. pow(k,2); to jest realizowane za pomocą (int)exp(2*log((double)k)) jak sądzisz ile dziesiątków razy jest to wolniejsze od prostego k*k?
  5. Rozkład normalny zrób jako: tab[i]=rand()%20+rand()%20+rand()%20+rand()%20+rand()%20; z tym że dla rozkładu liniowego owszem rand() jakoś ujdzie, zaś dla normalnego ro już porażka.
  6. Podaj jaki masz błąd.

1 użytkowników online, w tym zalogowanych: 0, gości: 1