Insertion sort - zasada dzialania, pseudokod, analiza krok po kroku
ð Podstawa programowa: I.2cSortowanie to uporzadkowanie elementow zbioru wedlug okreslonego kryterium (np. rosnaco, malejaco, alfabetycznie). Jest to jeden z najczesciej wykonywanych operacji w informatyce.
Sortowanie przez wstawianie dziala tak, jak ukladamy karty w rece podczas gry:
ALGORYTM SortowaniePrzezWstawianie(T, n):
// T - tablica, n - liczba elementow
DLA i OD 1 DO n-1:
klucz = T[i] // element do wstawienia
j = i - 1
// Przesuwamy elementy wieksze od klucza w prawo
DOPOKI j >= 0 ORAZ T[j] > klucz:
T[j+1] = T[j] // przesun w prawo
j = j - 1
T[j+1] = klucz // wstaw na wlasciwe miejsce
Tablica poczatkowa: [5, 3, 8, 1, 4]
Krok 1 (i=1): klucz=3
[5, 3, 8, 1, 4] <- 3 < 5, przesun 5 w prawo
[3, 5, 8, 1, 4] <- wstaw 3 na pozycje 0
Posortowane: [3, 5] | Reszta: [8, 1, 4]
Krok 2 (i=2): klucz=8
[3, 5, 8, 1, 4] <- 8 > 5, nic nie przesuwamy
[3, 5, 8, 1, 4] <- 8 zostaje na miejscu
Posortowane: [3, 5, 8] | Reszta: [1, 4]
Krok 3 (i=3): klucz=1
[3, 5, 8, 1, 4] <- 1 < 8, przesun 8
[3, 5, 8, 8, 4] <- 1 < 5, przesun 5
[3, 5, 5, 8, 4] <- 1 < 3, przesun 3
[3, 3, 5, 8, 4] <- wstaw 1 na pozycje 0
[1, 3, 5, 8, 4]
Posortowane: [1, 3, 5, 8] | Reszta: [4]
Krok 4 (i=4): klucz=4
[1, 3, 5, 8, 4] <- 4 < 8, przesun 8
[1, 3, 5, 8, 8] <- 4 < 5, przesun 5
[1, 3, 5, 5, 8] <- 4 > 3, STOP
[1, 3, 4, 5, 8] <- wstaw 4 na pozycje 2
Wynik: [1, 3, 4, 5, 8] - posortowane!
Posortuj tablice [7, 2, 5, 1, 9, 3] metoda przez wstawianie. Zapisz stan tablicy po kazdym kroku (po kazdym wstawieniu).
Poczatek: [7, 2, 5, 1, 9, 3]
i=1, klucz=2: 2<7, przesun 7
[2, 7, 5, 1, 9, 3]
i=2, klucz=5: 5<7, przesun 7; 5>2, stop
[2, 5, 7, 1, 9, 3]
i=3, klucz=1: 1<7, przesun 7; 1<5, przesun 5;
1<2, przesun 2; wstaw 1 na poz. 0
[1, 2, 5, 7, 9, 3]
i=4, klucz=9: 9>7, stop (zostaje na miejscu)
[1, 2, 5, 7, 9, 3]
i=5, klucz=3: 3<9, przesun 9; 3<7, przesun 7;
3<5, przesun 5; 3>2, stop
[1, 2, 3, 5, 7, 9]
Wynik: [1, 2, 3, 5, 7, 9]
Zmodyfikuj algorytm sortowania przez wstawianie, aby sortowal malejaco (od najwiekszego do najmniejszego). Nastepnie posortuj tablice [4, 8, 2, 6, 1] malejaco.
Modyfikacja: zmiana warunku z "T[j] > klucz" na "T[j] < klucz"
ALGORYTM SortowanieMalejaco(T, n):
DLA i OD 1 DO n-1:
klucz = T[i]
j = i - 1
DOPOKI j >= 0 ORAZ T[j] < klucz: // zmiana znaku!
T[j+1] = T[j]
j = j - 1
T[j+1] = klucz
Sortowanie [4, 8, 2, 6, 1] malejaco:
i=1, klucz=8: 8>4, przesun 4
[8, 4, 2, 6, 1]
i=2, klucz=2: 2<4, stop
[8, 4, 2, 6, 1]
i=3, klucz=6: 6>2, przesun 2; 6>4, przesun 4;
6<8, stop
[8, 6, 4, 2, 1]
i=4, klucz=1: 1<2, stop
[8, 6, 4, 2, 1]
Wynik: [8, 6, 4, 2, 1]
Policz liczbe porownan i przesuniec dla kazdego przypadku:
a) Tablica juz posortowana: [1, 2, 3, 4, 5]
b) Tablica posortowana odwrotnie: [5, 4, 3, 2, 1]
a) [1, 2, 3, 4, 5] - juz posortowana:
i=1: klucz=2, porownaj z 1: 2>1, stop (1 porownanie, 0 przesuniec)
i=2: klucz=3, porownaj z 2: 3>2, stop (1 porownanie, 0 przesuniec)
i=3: klucz=4, porownaj z 3: 4>3, stop (1 porownanie, 0 przesuniec)
i=4: klucz=5, porownaj z 4: 5>4, stop (1 porownanie, 0 przesuniec)
RAZEM: 4 porownania, 0 przesuniec -> O(n)
b) [5, 4, 3, 2, 1] - odwrotnie:
i=1: klucz=4, porownaj z 5: przesun (1 por., 1 przes.)
i=2: klucz=3, porownaj z 5,4: przesun oba (2 por., 2 przes.)
i=3: klucz=2, porownaj z 5,4,3: przesun (3 por., 3 przes.)
i=4: klucz=1, porownaj z 5,4,3,2: przesun (4 por., 4 przes.)
RAZEM: 10 porownan, 10 przesuniec -> O(n^2)
(Wzor: n*(n-1)/2 = 5*4/2 = 10)
Uzyj sortowania przez wstawianie do uporzadkowania listy nazwisk alfabetycznie (leksykograficznie). Zapisz kazdy krok:
["Nowak", "Kowalski", "Adamski", "Zielinski", "Borkowski"]
Poczatek: ["Nowak", "Kowalski", "Adamski", "Zielinski", "Borkowski"]
i=1, klucz="Kowalski":
"Kowalski" < "Nowak" (K < N), przesun "Nowak"
["Kowalski", "Nowak", "Adamski", "Zielinski", "Borkowski"]
i=2, klucz="Adamski":
"Adamski" < "Nowak", przesun "Nowak"
"Adamski" < "Kowalski" (A < K), przesun "Kowalski"
["Adamski", "Kowalski", "Nowak", "Zielinski", "Borkowski"]
i=3, klucz="Zielinski":
"Zielinski" > "Nowak" (Z > N), stop
["Adamski", "Kowalski", "Nowak", "Zielinski", "Borkowski"]
i=4, klucz="Borkowski":
"Borkowski" < "Zielinski", przesun "Zielinski"
"Borkowski" < "Nowak", przesun "Nowak"
"Borkowski" < "Kowalski", przesun "Kowalski"
"Borkowski" > "Adamski" (B > A), stop
["Adamski", "Borkowski", "Kowalski", "Nowak", "Zielinski"]
Wynik: ["Adamski", "Borkowski", "Kowalski", "Nowak", "Zielinski"]