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