I_P_W14_M12_C++ Sortowanie przez wstawianie w języku C++
Implementacja algorytmu sortowania przez wstawianie w języku C++
Napisz program sortujący niemalejąco tablicę n liczb całkowitych. Wykorzystaj metodę sortowania przez wstawianie. Funkcja powinna sortować wejściową tablicę w miejscuw miejscu. Przetestuj rozwiązanie dla danych:
Specyfikacja problemu:
Dane:
n– liczba naturalnatab– tablica zawierającanliczb całkowitych
Wynik:
posortowana niemalejąco tablica
nliczb całkowitychtab
Porównaj swoje rozwiązanie z przedstawionym poniżej.
Naszym zadaniem jest napisanie programu, który posortuje podaną przez użytkownika tablicę n liczb naturalnych, używając algorytmu sortowania przez wstawianie.
Załączamy niezbędną bibliotekę i zapisujemy funkcję main().
Tworzymy cztery zmienne. Pierwsza z nich to zmienna tab, która jest tablicą przechowującą n liczb całkowitych. Druga to zmienna n przechowująca rozmiar tablicy tab. Kolejne dwie zmienne to zmienne pomocnicze pom oraz j.
W zmiennej pom będzie tymczasowo przechowywany analizowany element tablicy.
Aby posortować tablicę, konieczne jest przeiterowanie po jej elementach. W tym celu zapiszemy pętlę for, która wykona się o jeden raz mniej niż wynosi liczba elementów do posortowania. Zatem początkowa wartość zmiennej i wynosi 1. Pętla for wykonuje się, dopóki nie zostaną posortowane wszystkie elementy tablicy (czyli i < n).
W pętli for zmiennej pom przypiszemy wartość elementu tablicy tab o indeksie i, natomiast wartość zmiennej j ustawimy na i - 1.
W zmiennej j będziemy przechowywać indeksy poszczególnych elementów znajdujących się w lewej części tablicy (czyli tych, które porównujemy z elementem przechowywanym w zmiennej pom).
Następnie definiujemy pętlę wewnętrzną while, która będzie wykonywana, dopóki spełnione będą naraz dwa warunki (warunki połączone operatorem logicznym &&).
Pierwszy warunek to j >= 0. Oznacza porównanie wartości elementów wszystkich tablicy z wartością przechowywaną przez zmienną pom.
W momencie, gdy warunek nie będzie już spełniony (j < 0), będzie to oznaczać, że każda liczba w posortowanej części tablicy została porównana z wartością zmiennej pom i była od niej mniejsza, czyli dotarliśmy na początek tablicy.
Drugi warunek (tab[j] > pom) sprawdza, czy element tablicy tab o indeksie j jest większy od elementu, którego wartość jest przechowywana w zmiennej pom. Jeśli warunki są spełnione, wykonywane jest przesunięcie elementu na miejsce j + 1.
W pętli while przypisujemy elementowi tablicy tab o indeksie j + 1 wartość elementu o indeksie j. Wykonujemy tę operację, by mieć możliwość zapisania wartości wstawianego elementu do części posortowanej, nie tracąc danych. Pętla jest wykonywana do momentu odnalezienia odpowiedniego miejsca w tablicy dla wstawianego elementu lub do momentu, gdy natrafimy na początek tablicy (czyli j = 0).
Zmniejszamy wartość zmiennej j o jeden i przechodzimy do ponownego sprawdzenia warunku pętli.
Ostatnią operacją wykonywaną w pętli for jest podstawienie w miejsce zmiennej zapisanej pod indeksem j + 1 wartości zmiennej pomocniczej pom. W ten sposób wstawiamy obecnie sprawdzaną liczbę na odpowiednie miejsce.
Tym samym posortowaliśmy tablicę liczb przez wstawianie. Teraz pozostaje wypisać posortowaną tablicę za pomocą pętli for.
Oto kod całego programu:
Przetestujmy działanie programu dla przykładowych danych.
Wynik działania programu:
Porównania
Liczba potrzebnych porównań elementów tablicy jest wyrażona wzorami:
przypadek optymistyczny: ,
przypadek pesymistyczny: .
Uwaga! Dwa porównania na początku pętli while liczymy jako jedno.
Złożoność czasowa algorytmu dla przypadku typowego to .
W tabeli przedstawiono porównania.
n | optymistyczna liczba porównań | pesymistyczna liczba porównań |
|---|---|---|
20 | 19 | 190 |
30 | 29 | 435 |
40 | 39 | 780 |
50 | 49 | 1225 |
60 | 59 | 1770 |
70 | 69 | 2415 |
80 | 79 | 3160 |
90 | 89 | 4005 |
100 | 99 | 4950 |
W tabeli przedstawiono przestawienia.
n | optymistyczna liczba przestawień | pesymistyczna liczba przestawień |
|---|---|---|
20 | 19 | 209 |
30 | 29 | 464 |
40 | 39 | 819 |
50 | 49 | 1247 |
60 | 59 | 1829 |
70 | 69 | 2484 |
80 | 79 | 3239 |
90 | 89 | 4094 |
100 | 99 | 5049 |