wtorek, 3 maja 2016

C++ - Sortowanie szybkie

W tym poście chciałbym przedstawić algorytm sortowanie szybkiego, zwanego QuickSort.

Opis działania


Jest to rekurencyjny algorytm oparty na metodzie dziel i zwyciężaj. Polega na dzieleniu całej grupy potrzebnej do posortowania na mniejsze części, które będą łatwiejsze do poukładania. Z całej tablicy wybierany jest element główny zwany osią. Jest on ustawiany losowo, nie musi to być element środkowy. Następnie względem niego przemieszczane są elementy większe, na prawą stronę, lub mniejsze, na stronę lewą, od wartości głównej. 


Wywołania rekurencyjne zakończą swoje działanie w momencie gdy rozmiar wybranego fragmentu tablicy będzie wynosił 1.

Program


Implementacja kodu w języku C++ prezentuje się następująco:

  1. #include <iostream>
  2. #include<cstdlib>
  3. using namespace std;
  4. //lewa jest to skrajny lewy indeks aktualnego fragmentu tablicy
  5. //prawo jest to prawy skrajny indeks aktualnego fragmentu tablicy
  6. void sortowanieszybkie(int *tablica, int lewa, int prawa)
  7. {
  8.     //wpisanie do zmiennej v wartości środkowej,
  9.     int v=tablica[(lewa+prawa)/2];
  10.     //zmienne pomocnicze
  11.     int i, j, x;
  12.     //wpisanie wartości skrajnej lewej do zmiennej i
  13.     i=lewa;
  14.     //wpisanie wartosci skrajnej lewej do zmiennej j
  15.     j=prawa;
  16.     do
  17.     {
  18.         //dopoki wartości w tablicy beda mniejsze od v
  19.         while(tablica[i]<v)
  20.         {
  21.             i++;
  22.         }
  23.         //dopoki wartosci od j
  24.         while(tablica[j]>v)
  25.         {
  26.             j--;
  27.         }
  28.         //jesli wartosc indeksu i jest mniejsza od indeksu j
  29.         if(i<=j)
  30.         {
  31.             //do zmiennej x przypisywany jest nowy element tablicy
  32.             x=tablica[i];
  33.             //zamiana elementów
  34.             tablica[i]=tablica[j];
  35.             tablica[j]=x;
  36.             i++;
  37.             j++;
  38.         }
  39.     }while(i<=j);
  40.     if(j>lewa)
  41.     {
  42.         //rekurencyjne wywołanie funkcji
  43.         sortowanieszybkie(tablica,lewa,j);
  44.     }
  45.     if(i<prawa)
  46.     {
  47.         //rekurencyjne wywołanie funkcji
  48.         sortowanieszybkie(tablica, i, prawa);
  49.     }
  50. }
  51. int main()
  52. {
  53.     int tablica[10] = {78290561267999434};
  54.     int i = 0;
  55.     for(= 0; i<10; i++)
  56.     {
  57.         cout << tablica[i] << " ,";
  58.     }
  59.     cout << endl;
  60.     sortowanieszybkie(tablica, 09);
  61.     for(= 0; i<10; i++)
  62.     {
  63.         cout << tablica[i] << " ,";
  64.     }
  65.     cout << endl;
  66.     return 0;
  67. }