Szybkie sortowanie

Transkrypt

Szybkie sortowanie
Sortowanie
Pomoc do wykładu stanowi program “Sortowanie”. Program ten nie
wymaga instalacji. Po ściągnięciu z internetu można go uruchomić np.
dwukrotnym kliknięciem lewym klawiszem myszki.
Program prezentuje trzy metody sortowania: bąbelkowe, sekwencyjne
i szybkie, w różnych wariantach. Umowny stopień uporządkowania
liczb w tablicy można zmieniać w zakresie -100 ... 100.
Program wyświetla liczbę porównań (p), zamian (z) oraz czas
sortowania (t).
Poniżej przedstawione zostały algorytmy zastosowane w programie.
Oznaczenia:
A = {a0, a1, ..., aN-1} – tablica
N – rozmiar tablicy
n, i – indeksy
<- - przypisanie (np. n <- 1)
<=> - zamiana
(np. an <=> ai)
Metoda bąbelkowa
Wersja podstawowa (nieoptymalna):
FOR n = 0, 1, ...,N-2
FOR i = 0, 1, ..., N-2
IF ai>ai+1 => ai<=>ai+1
Wersja jednokierunkowa (optymalizowana):
c – licznik zamian
n <- N-2
DO
c <- 0
FOR i = 0, 1, ..., n
IF ai>ai+1 => ai <=> ai+1
c++
n-WHILE c>0
Wersja dwukierunkowa (optymalizowana):
ib <- 0
ie <- N-2
DO
c <- 0
FOR i = ib, ib+1, ..., ie
IF ai>ai+1 => ai<=>ai+1
c++
ie-FOR i = ie-1, ie-2, ..., ib
IF ai>ai+1 => ai<=>ai+1
c++
ib++
WHILE c>0
Metoda sekwencyjna
Wersja bezpośrednia (nieoptymalna):
FOR n = 0, 1, ...,N-2
FOR i = n+1, n+2, ..., N-1
IF an>ai => an <=> ai
Wersja bezpośrednia (optymalizowana):
FOR n = 0, 1, ...,N-2
FOR i = N-1, N-2, ..., n+1
IF an>ai => an <=> ai
Wersja z minimum (optymalizowana):
pm – pozycja minimum
FOR n = 0, 1, ...,N-2
pm <- n
FOR i = n+1, n+2, ..., N-1
IF apm<ai => pm <- i
apm <=> an
Szybkie sortowanie
Szybkie sortowanie wymaga zastosowania funkcji rekurencyjnej.
Po przerzuceniu liczb mniejszych od p (pivot point) do lewej części
tablicy i liczb większych od p do prawej części, identyczna procedura
wykonywana jest na lewej a potem na prawej części tablicy. Punkt
podziału tablicy na dwie części wyznaczany jest dynamicznie, jako
punkt spotkania się indeksów l oraz r.
L, R – granice podtablicy
l, r – indeksy
p – punkt obrotu (pivot point)
QuickSort (L, R)
l <- L
r <- R
p <- a(l+r)/2
DO
WHILE al<p l++
WHILE ar<p r-IF l<=r => al <=> ar
WHILE l<=r
IF r>L => QuickSort (L, r)
IF l<R => QuickSort (l, R)
Sortowanie zostanie zrealizowane po wywołaniu funkcji:
QuickSort (0, N-1)
W praktycznej implementacji szybkiego sortowania w języku C++,
funkcji sortującej trzeba przekazać dodatkowo adres tablicy.
Deklaracja funkcji może mieć np. taką postać:
void QuickSort (int *A, int L, int R);
Szybkość sortowania
Głównym kryterium oceny algorytmów jest szybkość działania.
Szybkie sortowanie jest zdecydowanie najszybsze. Co istotne, czas
sortowania jest w przypadku tej metody proporcjonalny do rozmiaru
tablicy (w pozostałych algorytmach – proporcjonalny do kwadratu
rozmiaru tablicy).
Czas sortowania [s] – uporządkowanie 0
Rozmiar tabl.
Bąbelkowa
Sekwencyjna
Szybka
10 000
2
1
0,01
100 000
200
100
1 000 000
20 000
10 000
1
10 000 000
2 000 000
1 000 000
10
0,1
Czas sortowania zależy też od nieuporządkowania tablicy, jednak w
różnym stopniu dla różnych metod.
Czas sortowania [s] – uporządkowanie 99
Rozmiar tabl.
Bąbelkowa
Sekwencyjna
100 000
10
90
1 000 000
1 000
9 000
Szybka
0,05
0,5
Czas sortowania [s] – uporządkowanie -99
Rozmiar tabl.
Bąbelkowa
Sekwencyjna
100 000
30
110
1 000 000
3 000
1 100
Szybka
0,05
0,5

Podobne dokumenty