W programowaniu istnieje naprawd臋 bardzo du偶o metod sortowania. Zaczynaj膮c od najprostszych, ko艅cz膮c na trudnych i skomplikowanych implementacjach algorytm贸w. Najwa偶niejszym problemem przy sortowaniu jest to, 偶e ka偶dy algorytm sortuj膮cy zajmuje konkretn膮 ilo艣膰 pami臋ci obliczeniowej. Tak samo jak ka偶dy program komputerowy, kt贸ry rozwi膮zuje problem, posiada zasoby takie jak czas i pami臋膰 i s膮 one wyra偶ane w czasowej z艂o偶ono艣ci obliczeniowej. Algorytmy sortuj膮ce maj膮 r贸偶n膮 czasow膮 z艂o偶ono艣膰 obliczeniow膮, a przy tym ka偶dy z nich ma r贸偶n膮 wydajno艣膰. Je偶eli dochodzi do analizy takiego algorytmu przypisywana jest mu klasa z艂o偶ono艣ci obliczeniowej. Istniej膮 trzy podstawowe klasy:
- O(1) – klasa, w kt贸rej algorytm bez wzgl臋du na to ile danych posiada, wykonuje operacje stale, bez zmian;
- O(n) – klasa, w kt贸rej algorytm dla ka偶dej danej (n) wykona okre艣lon膮 i sta艂膮 liczb臋 operacji;
- O(n2) – klasa, w kt贸rej algorytm dla ka偶dej danej (n) wykona operacje proporcjonalnie.
Podstawowe algorytmy sortowania posiadaj膮 z艂o偶ono艣ci czasowe typu O(n2), a dla ma艂ych wska藕nik贸w n, te czasy sortowania s膮 do przyj臋cia. Metody sortowania o takich samych elementach warto艣ci klucza, kt贸re mog膮 zachowa膰 pocz膮tkowy porz膮dek nazywane s膮 algorytmami stabilnymi.
Aby ocenia膰 czasow膮 z艂o偶ono艣膰 obliczeniow膮 nale偶y wzi膮膰 pod uwag臋 por贸wnywanie dw贸ch danych oraz przestawianie (zamienianie) element贸w. Z艂o偶ono艣膰 pami臋ciowa to b臋dzie ilo艣膰 potrzebnej pami臋ci, jak膮 wykorzysta algorytm sortuj膮cy w celu uporz膮dkowania danych, bez pami臋ci na przechowanie zawartych danych. Algorytmy, kt贸re posiadaj膮 klas臋 O(1) sta艂膮 s膮 zaliczane do algorytm贸w sortuj膮cych w miejscu. S膮 to takie implementacje, kt贸re opr贸cz pami臋ci na informacje potrzebuje sta艂膮 ilo艣膰 pami臋ci na uporz膮dkowanie ich.
W celu wykonania eksperymentu, w jakim czasie sortuj膮 podane wy偶ej algorytmy sortowania, stworzymy program. Aplikacja b臋dzie wype艂nia膰 tablic臋 losowymi liczbami, ilo艣膰 liczb podawana b臋dzie przez u偶ytkownika, nast臋pnie algorytmy sortuj膮ce uporz膮dkuj膮 dane od najmniejszego do najwi臋kszego. Nasza aplikacja zmierzy czasy sortowa艅 i wypisze je na ekran.
Standardowo zaczynamy od dodania bibliotek do naszego programu, a b臋dzie to „iostream”, „time.h”, oraz „windows.h”. Dodatkowo umieszczamy linijk臋 z „using namespace std”, kt贸ra poinformuje kompilator o tym by wszystkie funkcje, nie wymaga艂y u偶ycia przedrostka „std”.
Dodawanie bibliotek.
Nast臋pnie definiujemy zmienne ile, zegar oraz czas. Nale偶y to zrobi膰 by kompilator wiedzia艂, jakiego typu s膮 to dane. Dalej dodajemy do programu nasze funkcje z algorytmami sortowania.
Kod przedstawiaj膮cy implementacj臋 zegara oraz funkcji z algorytmami sortuj膮cymi.
Kolejnym krokiem jest umieszczenie g艂贸wnej funkcji „main”, dodanie napis贸w na ekran, oraz wczytanie do programu ile losowych liczb ma zawiera膰 dynamiczna tablica.
Wypisanie tekst贸w na ekran.
Nast臋pnie przypisujemy dynamiczn膮 alokacj臋 tablicy. Robimy to po to, poniewa偶 z za艂o偶enia nie wiemy ile warto艣ci znajdzie si臋 w tablicy. Nie musimy okre艣la膰 g贸rnej granicy gdy偶 tablica b臋dzie rozszerza膰 si臋 o pola dynamicznie. Do zrobienia tego u偶ywa si臋 wska藕nik贸w.
Przypisanie dynamicznej alokacji tablicy.
Kolejnym krokiem jest zainicjowanie generatora liczb losowych oraz wype艂nienie nimi tablicy. Do generacji u偶ywamy komendy srand(). Nast臋pnie musimy przepisa膰 warto艣ci z pierwszej tablicy do dw贸ch pozosta艂ych, tak 偶eby dane wsz臋dzie by艂y jednakowe.
Zainicjowanie generatora liczb losowych.
Kolejnym etapem jest wywo艂anie napis贸w na ekran, rozpocz臋cie odliczania zegara, wywo艂anie funkcji sortowania, zatrzymanie czasu zegara, obliczenie warto艣ci czasu sortowania i wypisania go na ekran. Nale偶y powt贸rzy膰 te czynno艣ci przy ka偶dym sortowaniu.
Na koniec nale偶y zwolni膰 pami臋膰, kt贸r膮 przydzielili艣my dynamicznie. Wykorzystuje si臋 do tego operatora „delete”. Musimy pami臋ta膰 tak偶e o nawiasie kwadratowym, poniewa偶 nasz wska藕nik by艂 tablic膮 rekord贸w. Po tej operacji ko艅czymy program operatorem „return 0”, oraz zamykaj膮c nawias funkcji g艂贸wnej.