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:
- #include <iostream>
- #include<cstdlib>
- using namespace std;
- //lewa jest to skrajny lewy indeks aktualnego fragmentu tablicy
- //prawo jest to prawy skrajny indeks aktualnego fragmentu tablicy
- void sortowanieszybkie(int *tablica, int lewa, int prawa)
- {
- //wpisanie do zmiennej v wartości środkowej,
- int v=tablica[(lewa+prawa)/2];
- //zmienne pomocnicze
- int i, j, x;
- //wpisanie wartości skrajnej lewej do zmiennej i
- i=lewa;
- //wpisanie wartosci skrajnej lewej do zmiennej j
- j=prawa;
- do
- {
- //dopoki wartości w tablicy beda mniejsze od v
- while(tablica[i]<v)
- {
- i++;
- }
- //dopoki wartosci od j
- while(tablica[j]>v)
- {
- j--;
- }
- //jesli wartosc indeksu i jest mniejsza od indeksu j
- if(i<=j)
- {
- //do zmiennej x przypisywany jest nowy element tablicy
- x=tablica[i];
- //zamiana elementów
- tablica[i]=tablica[j];
- tablica[j]=x;
- i++;
- j++;
- }
- }while(i<=j);
- if(j>lewa)
- {
- //rekurencyjne wywołanie funkcji
- sortowanieszybkie(tablica,lewa,j);
- }
- if(i<prawa)
- {
- //rekurencyjne wywołanie funkcji
- sortowanieszybkie(tablica, i, prawa);
- }
- }
- int main()
- {
- int tablica[10] = {7, 8, 2, 90, 56, 12, 67, 99, 94, 34};
- int i = 0;
- for(i = 0; i<10; i++)
- {
- cout << tablica[i] << " ,";
- }
- cout << endl;
- sortowanieszybkie(tablica, 0, 9);
- for(i = 0; i<10; i++)
- {
- cout << tablica[i] << " ,";
- }
- cout << endl;
- return 0;
- }