Zauważmy, szukaj

Transkrypt

Zauważmy, szukaj
• Przedstawiamy algorytmy porządkowania dowolnej liczby elementów,
którymi mogą być liczby, jak również elementy o bardziej złożonej postaci
(takie jak słowa i daty).
• Porządkowanie, nazywane również często sortowaniem (Steinhaus używa
terminu szeregowanie), ma olbrzymie znaczenie niemal w każdej
działalności człowieka.
• Jeśli elementy w zbiorze są uporządkowane zgodnie z jakąś regułą (np.
książki lub ich karty katalogowe według liter alfabetu, słowa w encyklopedii,
daty, czy nawet osoby według wzrostu), to wykonywanie wielu operacji na
tym zbiorze staje się łatwiejsze. Między innymi dotyczy to operacji:
• sprawdzenia, czy dany element, tj. element o ustalonej wartości cechy,
według której zbiór został uporządkowany, znajduje się w zbiorze;
– znalezienia elementu w zbiorze, gdy w nim jest;
– dołączenia nowego elementu w odpowiednie miejsce, aby zbiór pozostał nadal
uporządkowany.
Luty 2001
Algorytmy (5) 2000/2001
[email protected]
1
• Komputery w dużym stopniu zawdzięczają swoją szybkość temu, że działają
na uporządkowanych informacjach.
• Jeśli chcemy na przykład sprawdzić, czy w jakimś katalogu dyskowym
znajduje się plik, to najpierw odpowiednio porządkujemy listę plików.
• Producenci komputerów w 1973 r. szacowali, że przez ponad 25% czasu
pracy komputera jest wykonywane porządkowanie. Obecnie porządkowanie
to (wobec większego skomplikowania programów) zajmuje jeszcze więcej
czasu. (Porządkowanie jest także podstawową operacją wykonywaną na
bazach danych.)
• Omawiane algorytmy porządkowania mogą być stosowane do ciągów
zawierających dowolna liczbę elementów.
• Dwa pierwsze algorytmy są realizacjami bardzo naturalnych pomysłów
wynikających wprost z definicji problemu porządkowania.
• Omówimy także sposób sortowania informacji innych niż liczby (słowa lub
rekordy).
Luty 2001
Algorytmy (5) 2000/2001
[email protected]
2
Algorytm bąbelkowy
• Opiera się on na bardzo prostej koncepcji: jeśli ciąg nie jest uporządkowany,
to znajdują się w nim przynajmniej dwa elementy, które nie są na właściwych
miejscach - przestawiamy je i postępujemy tak, aż wszystkie będą na
właściwych miejscach.
• Można nieco uprościć to postępowanie. Zauważmy, że:
– jeśli ciąg zawiera dwa elementy, które nie są jeszcze ustawione we właściwej
kolejności, to istnieją w nim dwa elementy, które stoją obok siebie i nie są we
właściwej kolejności.
– Na przykład, w ciągu {2, 4, 6, 1, 3, 5} elementy 4 i 3 nie są we właściwym
miejscu, ale istnieją dwa elementy 6 i 1 stojące obok siebie, które również nie są
odpowiednio uszeregowane.
– Z kolei po ich przestawieniu, elementy 4 i 1 oraz 6 i 3 znajdą się na
niewłaściwych pozycjach.
– Zatem, w ciągu nieuporządkowanym wystarczy przestawić ze sobą elementy,
które są ustawione w złym porządku i znajdują się na sąsiednich miejscach.
Luty 2001
Algorytmy (5) 2000/2001
[email protected]
3
• Aby tę strategię porządkowania zamieniæ na algorytm, musimy określić
dodatkowo, w jakim porządku będziemy szukać takich par do przestawienia.
– Z jednej strony bowiem nie możemy pominąć żadnej z nich.
– Z drugiej - chcemy to robić w możliwie najbardziej efektywny sposób.
• Algorytm bąbelkowy jest metodą porządkowania ciągów, która polega na
przestawianiu sąsiednich par elementów stojących w nieodpowiedniej
kolejności, przy czym ciąg jest przeglądany w tym samym kierunku tak
długo, jak długo może w nim wystąpić jeszcze para elementów w
niewłaściwym porządku.
• Oznacza to, że po każdym przestawieniu dwóch elementów należy
sprawdzić, czy ta zmiana nie zepsuła właściwego uporządkowania między
innymi sąsiednimi elementami.
• Elementy o większych wartościach są wynoszone wyżej, jakby przywiązane
zostały do nich większe bąbelki powietrza - stąd nazwa algorytmu.
• Klamrami oznaczone są zamiany elementów.
– Poziome linie to granica o obszaru, w którym nie trzeba wykonywać już
przestawień.
• Przykład ilustruje, że wraz z liczbą kroków zwiększa się liczba elementów,
które stoją na właściwym miejscu.
Luty 2001
Algorytmy (5) 2000/2001
[email protected]
4
Przykład sortowania bąbelkowego
Luty 2001
9
10
10
10
10
7
9
9
9
9
1
7
7
7
7
10
1
4
4
4
4
4
1
3
3
2
3
3
1
2
3
2
2
2
1
Algorytmy (5) 2000/2001
[email protected]
5
• Dane:
• Wynik:
• Krok 1:
• Krok 2:
• Krok 3:
Algorytm bąbelkowy porządkowania ciagu liczb
Liczba naturalna n i ciąg n liczb x1, x2,...,xn
Uporządkowanie tego ci¹gu liczb od najmniejszej do
największej.
Kres := n {Kres określa miejsce w ciągu, oznaczone na
rysunku czerwoną linią stanowiące granicę poszukiwania pary
elementów do przestawiania.}
Przyjmij i:=1 oraz k:= 0 {k jest wskaźnikiem przestawionej
pary}
Dopóki i < Kres, wykonuj:
– jeśli xi > xi + 1 , to przestaw te dwa elementy i przyjmij k := i
– zwiększ i: i:= i + 1
• Krok 4:
Luty 2001
Jeśli k > 1, to przyjmij Kres :=k i wróć do kroku 2, a w
przeciwnym razie zakończ algorytm.
Algorytmy (5) 2000/2001
[email protected]
6
Porządkowanie przez wybór
• Algorytm opisany w tym punkcie można, podobnie jak algorytm bąbelkowy,
wyprowadzić niemal z definicji problemu porządkowania. Zauważymy, że:
– jeśli mamy ustawić elementy ciągu w kolejności od najmniejszego do
największego, to można wybrać w nim najpierw element najmniejszy i umieścić
go na początku,
– za nim umieścić drugi najmniejszy element ciągu ( czyli najmniejszy w
pozostałym ciągu) itd.
• Metoda ta nazywa się algorytmem porządkowania przez wybór.
• Do jej dokładnego opisania jesteśmy już przygotowani, gdyż poznaliśmy
szybką (wręcz optymalną) metodę znajdowania najmniejszego elementu w
ciągu.
• Musimy jedynie podać, w jaki sposób kolejno znajdowane elementy, od
najmniejszego do największego, mają być ustawione jeden za drugim.
• Najoszczędniej byłoby robić to w tym samym miejscu, w którym jest
zapisany ciąg do uporządkowania. Tego typu algorytm określany jest
terminem in situ.
Luty 2001
Algorytmy (5) 2000/2001
[email protected]
7
• Jest to możliwe!
– Znaleziony element zmienia się miejscami z elementem, który zajmuje jego
miejsce w uporządkowanym ciągu.
– Po znalezieniu najmniejszego elementu trzeba zamienić go miejscami z
pierwszym elementem ciągu.
– W następnym etapie - drugi najmniejszy element w ciągu zamienić miejscami z
drugim elementem ciągu itd.
– W takiej realizacji tej metody, wystarczy znajdować miejsce (a dokładniej - jego
indeks) w ciągu zajmowane przez coraz większe elementy.
• UWAGA:
– Bieżący najmniejszy element może się już znajdować na swoim miejscu w ciągu.
– W prezentowanej realizacji algorytmu nie wyróżniamy tej sytuacji i zamieniamy
element sam ze sobą.
Luty 2001
Algorytmy (5) 2000/2001
[email protected]
8
Algorytm porządkowania przez wybór
Dane: Liczba naturalna n i ciąg n liczb x1, x2, ..., xn
Wynik: Uporządkowanie tego ciągu liczb od najmniejszej do
największej.
• Krok 1:
Dla i = 1, 2, ...,n -1 wykonaj kroki 2 i 3.
• Krok 2:
Znajdź k takie , że xk jest najmniejszym elementem w podciągu
xi, ..., xn.
• Krok 3:
Zamień miejscami elementy xi oraz xk.
Luty 2001
Algorytmy (5) 2000/2001
[email protected]
9
Przykład porządkowania przez wybór
Luty 2001
9
9
9
9
9
9
10
7
7
7
7
7
10
9
1
3
3
4
10
7
7
10
10
10
10
4
4
4
4
4
4
3
3
3
3
2
2
2
2
2
2
2
3
1
1
1
1
1
1
Algorytmy (5) 2000/2001
[email protected]
10
•
•
•
•
Złożoność obliczeniowa algorytmu.
Aby znaleźć postać wyrażenia określającego liczbę działań (porównań i
przestawień elementów) wykonywanych w algorytmie porządkowania przez
wybór, wystarczy zauważyć, że jest on iteracją algorytmu znajdowania
najmniejszego elementu, a ciąg, w którym szukamy najmniejszego elementu
jest w kolejnych iteracjach coraz krótszy.
Liczba przestawień elementów jest równa liczbie iteracji, a więc wynosi n-1.
Liczba porównań, jest w algorytmie znajdowania minimum w ciągu jest o
jeden mniejsza od liczby elementów w ciągu.
Ponieważ w każdym kroku liczba elementów w poszukiwanym podciągu jest
o jeden mniejsza, zatem w algorytmie porządkowania przez wybór, dla ciągu
danych złożonego z n elementów, liczba porównań wynosi:
(n - 1) + (n - 1) + ... + 2 + 1 = n (n + 1) / 2
Luty 2001
Algorytmy (5) 2000/2001
[email protected]
11
Luty 2001
Algorytmy (5) 2000/2001
[email protected]
12