wtorek, 12 kwietnia 2016

C++ - Wyszukiwanie liczb w tabeli

W tym poście chciałbym opisać sposób wyszukiwania liczb w tabeli posortowanej. Algorytm wyszukiwania będzie się opierał na metodzie zwanej przeszukiwaniem binarnym.

Program


W pierwszej kolejności należy się zająć częścią programu odpowiedzialną za sortowanie liczb. Ja wykorzystałem algorytm sortowania bąbelkowego. Jest to jedna z prostszych metod sortowania. Działa ona dosyć dobrze na małych zbiorach, przy większych zbiorach raczej sobie nie poradzi za dobrze.


Dane w czasie sortowania są przemieszczają się w prawą stronę, czyli ku ostatniemu elementowi w tablicy. Ich miejsce zajmują elementy o mniejszej wartości. Algorytm jest powtarzany dla każdej z liczb z pominięciem licz które zostały już posortowane. Całość jest powtarzana aż do momentu ich poprawnego ułożenia.

  1. void sortowanie(int tab[],int n)
  2. {
  3.   for(int i=0;i<n;i++)
  4.   {
  5.     for(int j=1;j<n-i;j++)
  6.     {
  7.         if(tab[j-1]>tab[j])
  8.         {
  9.           //Zamiana elementow miejscami
  10.           swap(tab[j-1], tab[j]);
  11.         }
  12.     }
  13.   }
  14. }

Poniżej wklejam pełny kod programu wraz z komentarzem:

  1. #include <iostream>
  2. #include<cstdlib>
  3. #define TabEle 16
  4. using namespace std;
  5. int wyszukaj(int  tabl[]int x, int left, int right);
  6. void sortowanie(int tab[],int n);
  7. int main()
  8. {
  9.      //Deklaracja tablicy
  10.      int tabl[TabEle]={2,1,15,34,20,29,45,32,18,39,21,71,43,47,11,9};
  11.      const int Szuk1 = 45;
  12.      const int Szuk2 = 38;
  13.      //Wypisanie i wyświetlenie wyszukanych cyfr
  14.      for(int i=0; i<TabEle; i++)
  15.      {
  16.        cout << tabl[i] << "  ";
  17.      }
  18.      //Przejscie do nowej linii
  19.      cout << endl;
  20.      sortowanie(tabl, TabEle);
  21.      for(int i=0; i<TabEle; i++)
  22.      {
  23.        cout << tabl[i] << "  ";
  24.      }
  25.      cout << endl;
  26.      //Przeszukiwanie tablicy, wyszukanie miejsc na jakiej znajduja sie elementy
  27.      //Jesli elementu nie ma w tablicy to wyswietli wartosc -1
  28.      cout << "Wyszukaj liczbe "<< Szuk1 << ", jej pozycja to: " << wyszukaj(tabl,Szuk1, 016)<<endl;
  29.      if(wyszukaj(tabl, 3,0,16)>-1)
  30.      {
  31.          cout << "Wyszukaj liczbe " << Szuk2 << ", jej pozycja to: " << wyszukaj(tabl, Szuk2, 016);
  32.      }
  33.      else
  34.      {
  35.          cout << "Nie znaleziono szukanej liczby" << endl;
  36.      }
  37.      return 0;
  38. }
  39. int wyszukaj(int  tabl[]int x, int left, int right)
  40. {
  41.      if(left>right)
  42.      {
  43.          //Jesli nie znajdzie elementu, wtedy zwrocona bedzie wartosc -1
  44.          return -1;
  45.      }
  46.      else
  47.      {
  48.          //Przypisanie zmiennej srodek wartosci rownej polowie liczby elementow
  49.          int srodek=(left+right)/2;
  50.          //Sprawdzenie czy wartosc srodkowa jest szukanym elementem
  51.          if(tabl[srodek]==x)
  52.          {
  53.            //Jesli znajdzie element wtedy zwraca jego pozycje
  54.            return srodek;
  55.          }
  56.          else
  57.          {
  58.                 //Sprawdzenie wartosci elementu
  59.                 if(x<tabl[srodek])
  60.                 {
  61.                     //Wejscie do funkcji wyszukiwania w strone nizszej pozycji
  62.                     return wyszukaj(tabl,x,left,srodek-1);
  63.                 }
  64.                 else
  65.                 {
  66.                     //Wyjscie do funkcji wyszukiwania w strone wyzszej pozycji
  67.                     return wyszukaj(tabl,x,srodek+1,right);
  68.                 }
  69.          }
  70.     }
  71. }
  72. void sortowanie(int tab[],int n)
  73. {
  74.   for(int i=0;i<n;i++)
  75.   {
  76.     for(int j=1;j<n-i;j++)
  77.     {
  78.         if(tab[j-1]>tab[j])
  79.         {
  80.           //Zamiana elementow miejscami
  81.           swap(tab[j-1], tab[j]);
  82.         }
  83.     }
  84.   }
  85. }

W pierwszej kolejności deklarowana jest tablica elementów oraz zmienne. Następnie wyświetlana jest aktualna tablica liczb, która w kolejnych krokach jest sortowana. Funkcja wyszukiwania zadanej wartości przechodzi po kolejnych jej elementach do momentu odnalezienia zadanej wartości.