Sortowanie LABORKA Piotr Ciskowski
main Zaimplementuj metody sortowania przedstawione w następnych zadaniach Dla każdej metody osobna funkcja Nagłówek funkcji wg uznania ale wszystkie razem powinny być spójne Daj wybór: rosnąco/malejąco Tablice mają być tworzone dynamicznie (w programie głównym) Zaimplementuj funkcję sprawdzającą poprawność posortowania dla mniejszych tablic może je wyświetlać na ekranie dla większych niech tylko sprawdza W programie głównym przeprowadź analizę efektywności algorytmów Posortuj 30 tablic i uśrednij czas działania każdej metody: Każdą tablicę posortuj każdą zaimplementowaną metodą - w danym przebiegu sortowana ma być ta sama tablica różnymi metodami - a potem średnia dla każdej metody Jedna trzydziestka dla: wszystkich elementów tablicy losowych Druga trzydziestka dla: 25% początkowych elementów posortowanych Trzecia trzydziestka dla: 50% początkowych elementów posortowanych Czwarta trzydziestka dla: 95% początkowych elementów posortowanych Piątka trzydziestka dla: 100% początkowych elementów posortowanych w odwrotnej kolejności I tak po pięć trzydziestek dla tablicy: małej, średniej, dużej i napisz krótkie sprawozdanko z wnioskami
zadanie 1 SORTOWANIE BĄBELKOWE
zadanie 1. sortowanie przez prostą zamianę czyli bąbelkowe porównywanie i zamiana par sąsiadujących elementów opis wg Łukasza Jelenia: Porównywane są dwa sąsiednie elementy tablicy, na początku ostatni i przedostatni. Jeśli ich kolejność jest niewłaściwa, to zamieniane są one miejscami. Porównanie powtarzane jest dla pozostałych elementów. Po pierwszym przebiegu element najmniejszy znajdzie się na początku tablicy (w części uporządkowanej). W kolejnych krokach procedura jest powtarzana, ale tylko dla nieuporządkowanej części tablicy. W ulepszonej wersji algorytmu sortowanie powinno zostać zakończone w sytuacji, gdy po wykonaniu całego przebiegu nie zostanie wykonana ani jedna zamiana. opis wikipedia: http://pl.wikipedia.org/wiki/sortowanie_b%c4%85belkowe ilustracja Hungarian dance: https://www.youtube.com/watch?v=lyzqpjut5b4
zadanie 1. sortowanie przez prostą zamianę schemat blokowy: P WE n, a 1,, a n i:=2 j:=n NIE a j-1 > a j TAK bufor:=a j a j :=a j-1 a j-1 :=bufor TAK j = i NIE j:=j-1 TAK i = n NIE i:=i+1 WY a 1,, a n K
zadanie 1. sortowanie przez prostą zamianę przykład:
zadanie 2 SORTOWANIE PRZEZ WYBIERANIE
zadanie 2. sortowanie przez wybieranie znajdowanie najmniejszego elementu w zbiorze przeniesienie na początek opis wikipedia: http://pl.wikipedia.org/wiki/sortowanie_przez_wybieranie ilustracja Gypsy dance: https://www.youtube.com/watch?v=ns4tptc8whw
zadanie 2. sortowanie przez wybieranie schemat blokowy - ogólny: i:=1 spośród elementów: a i,, a n znajdź najmniejszy: a k wymień a i z a k TAK i = n-1 NIE i:=i+1
zadanie 2. sortowanie przez wybieranie schemat blokowy - szczegółowy: P WE n, a 1,, a n i:=1 k:=i x:=a i j:=i+1 NIE a j < x TAK k:=j x:=a j TAK j = n NIE j:=j+1 a k :=a i a i :=x TAK i = n-1 NIE i:=i+1 WY a 1,, a n K
zadanie 2. sortowanie przez wybieranie przykład: TABLICA POCZĄTKOWA 16 5 12 33 0 8 3 1 przeglądanie 0 5 12 33 16 8 3 2 przeglądanie 0 3 12 33 16 8 5 3 przeglądanie 0 3 5 33 16 8 12 4 przeglądanie 0 3 5 8 16 33 12 5 przeglądanie 0 3 5 8 12 33 16 6 przeglądanie 0 3 5 8 12 16 33 TABLICA UPORZĄDKOWANA
zadanie 3 SORTOWANIE PRZEZ WSTAWIANIE
zadanie 3. sortowanie przez wstawianie pusta ręka bierzemy ze stołu kolejne karty i wstawiamy w odpowiednie miejsce opis wg Łukasza Jelenia: Zakładamy, że początkowa część tablicy jest już posortowana (na początku będzie to pierwszy element tablicy). Pierwszy element z drugiej (nieposortowanej) części tablicy przenoszony jest do zmiennej pomocniczej. Porównywana jest wartość tej zmiennej z kolejnymi elementami pierwszej (posortowanej) części tablicy (zaczynając od ostatniego). Dopóki elementy te są większe, to przesuwane są o jedna pozycje w prawo. Po zakończeniu przesuwania element ze zmiennej pomocniczej wstawiany jest w wolne miejsce. Procedura jest powtarzana dopóki pozostają jeszcze jakieś elementy w drugiej, nieuporządkowanej części tablicy. opis wikipedia: http://pl.wikipedia.org/wiki/sortowanie_przez_wstawianie ilustracja Romanian dance: https://www.youtube.com/watch?v=kpra0w1kecg
zadanie 3. sortowanie przez wstawianie schemat blokowy: j:=2 x:=a j wstaw x w posortowany ciąg: a 1,, a j-1 TAK j = n NIE j:=j+1
zadanie 3. sortowanie przez wstawianie pseudopascalokod: Początek j:=2; Dopóki j<=n wykonuj Początek x:=a[j]; i:=j-1; Dopóki i>0 a[i]>x wykonuj Początek a[i+1]:=a[i]; i:=i-1 Koniec; a[i+1]:=x; j:=j+1 Koniec; Koniec;
zadanie 3. sortowanie przez wstawianie przykład: TABLICA POCZĄTKOWA 9 5 2 1 1 przeglądanie 5 9 2 5 9 2 5 9 1 2 5 9 TABLICA UPORZĄDKOWANA
zadanie 4 SORTOWANIE SHELLA
zadanie 4. sortowanie metodą malejących przyrostów czyli Shella uporządkować elementy oddalone o n potem o n/2 - - w końcu sąsiednie opis wg Łukasza Jelenia: Sortowana tablica dzielona jest na kilka podtablic utworzonych z elementów oddalonych o ustalona liczbę pozycji. Tablice te są oddzielnie sortowane (zwykle metoda sortowania przez wstawianie lub bąbelkowego algorytmy te dobrze sprawdzają się dla danych częściowo posortowanych). W kolejnych krokach wykonywane są podziały z coraz mniejszym odstępem (dające coraz mniejsza liczbę podtablic) aż do uzyskania tylko jednej tablicy. Kluczowym problemem jest dobór odpowiedniej sekwencji odstępów przy podziałach tablicy (można użyć zasady zaproponowanej przez D. Knutha). opis wikipedia: http://pl.wikipedia.org/wiki/sortowanie_shella ilustracja Hungarian dance: https://www.youtube.com/watch?v=cmpaze8mx0
zadanie 4. sortowanie Shella pseudopascalokod: Początek zamiana:=fałsz; delta:=n; Dopóki (zamiana) wykonuj Początek Jeśli delta>=1 to Początek delta:=delta div 2; Powtarzaj zamiana:=fałsz; i:=1; Dopóki i<=n-delta wykonuj Początek Jeśli a[i]>a[i+delta] to Początek bufor:=a[i+delta]; a[i+delta]:=a[i]; a[i]:=bufor; zamiana:=prawda Koniec; { Jeśli a[i]>a[i+delta] } i:=i+1 Koniec { Dopóki i<=n-delta } Aż do zamiana= Fałsz Koniec { Jeśli delta >=1 } W przeciwnym razie zamiana = Prawda Koniec { Dopóki nie zamiana } Koniec
zadanie 4. sortowanie Shella przykład: tablica początkowa: elementy oddalone o 4: TABLICA POCZĄTKOWA 1 3 8 4 2 6 5 Porównujemy i przestawiamy elementy oddalone o 4 1 3 8 4 2 6 5 1 3 8 4 2 6 5 1 6 8 4 2 3 5 2 6 8 4 1 3 5
zadanie 4. sortowanie Shella przykład: elementy oddalone o 2: (pierwszy przebieg) 5 3 1 4 8 6 2 Sortowanie co dwa 1 3 5 4 8 6 2 1 3 5 4 8 6 2 1 3 5 4 8 6 2 1 3 5 4 8 6 2 1 3 5 4 2 6 8
zadanie 4. sortowanie Shella przykład: elementy oddalone o 2: (drugi przebieg) 1 3 5 4 2 6 8 Sortowanie co dwa 1 3 5 4 2 6 8 1 3 5 4 2 6 8 1 3 2 4 5 6 8 1 3 2 4 5 6 8 1 3 2 4 5 6 8
zadanie 4. sortowanie Shella przykład: elementy oddalone o 1: 1 3 2 4 5 6 8 Sortowanie co jeden 1 3 2 4 5 6 8 1 2 3 4 5 6 8 1 2 3 4 5 6 8 1 2 3 4 5 6 8 1 2 3 4 5 6 8 1 2 3 4 5 6 8 1 2 3 4 5 6 8 TABLICA UPORZĄDKOWANA
zadanie 5 SORTOWANIE PRZEZ SCALANIE
zadanie 5. sortowanie przez scalanie dziel i zwyciężaj dziel ciąg na dwa podciągi zwyciężaj posortuj te dwa podciągi łącz posortowane podciągi jeden posortowany opis wg Łukasza Jelenia: Sortowana tablica dzielona jest rekurencyjnie na dwie podtablice aż do uzyskania tablic jednoelementowych. Następnie podtablice te są scalane w odpowiedni sposób, dający w rezultacie tablice posortowaną. Wykorzystana jest tu metoda podziału problemu na mniejsze, łatwiejsze do rozwiązania zadania ( dziel i rządz ). opis wikipedia: http://pl.wikipedia.org/wiki/sortowanie_przez_scalanie ilustracja German dance: https://www.youtube.com/watch?v=xaqr3g_nvoo
zadanie 5. sortowanie przez scalanie schemat blokowy: P WE n, a 1,, a n NIE n > 1 TAK Podzielić ciąg a na dwa podciągi a1 i a2 jednakowej długości (z dokładnością do 1) Zastosować tą samą metodę sortowania do ciągu a1 Zastosować tą samą metodę sortowania do ciągu a2 Scalić uporządkowane już ciągi a1 i a2 w nowy, uporządkowany ciąg a WY a 1,, a n K
zadanie 5. sortowanie przez scalanie pseudopascalokod: Procedura SORTUJ; Początek Podziel ciąg na dwa podciągi; Jeśli lewy podciąg zawiera więcej niż jeden element to Wywołaj rekurencyjnie procedurę SORTUJ; Jeśli prawy podciąg zawiera więcej niż jeden element to Wywołaj rekurencyjnie procedurę SORTUJ; Scal dwa posortowane podciągi Koniec
zadanie 5. sortowanie przez scalanie przykład: TABLICA POCZĄTKOWA 2-1 4 10 3 0 dziel 2-1 4 10 3 0 dziel dziel 2-1 4 10 3 0 dziel dziel 2-1 10 3 scalaj scalaj -1 2 3 10 scalaj scalaj -1 2 4 0 3 10 scalaj -1 0 2 3 4 10 TABLICA UPORZĄDKOWANA
zadanie 6 SORTOWANIE SZYBKIE
zadanie 6. sortowanie szybkie dziel i zwyciężaj dziel tablica A l,, A p jest dzielona (tzn. elementy tej tablicy są przestawiane) na dwie niepuste części A l,, A j oraz A i,, A p takie, że każdy element A l,, A j jest nie większy niż każdy element A i,, A p, indeks rozdzielający wyznaczany jest za pomocą zmiennej T zwyciężaj dwie części tablicy A l,, A j oraz A i,, A p są sortowane za pomocą rekurencyjnych wywołań procedury SORTUJ łącz ponieważ części tablicy są sortowane w miejscu, nie trzeba nic robić, aby je połączyć: cała tablica A l,, A p jest posortowana
zadanie 6. sortowanie szybkie dziel i zwyciężaj opis wg Łukasza Jelenia: Na początku wybierany jest tzw. element osiowy. Następnie tablica dzielona jest na dwie podtablice. Pierwsza z nich zawiera elementy mniejsze od elementu osiowego, druga elementy większe lub równe, element osiowy znajdzie się miedzy nimi. Proces dzielenia powtarzany jest aż do uzyskania tablic jednoelementowych, nie wymagających sortowania. Właściwe sortowanie jest tu jakby ukryte w procesie przygotowania do sortowania. Wybór elementu osiowego wpływa na równomierność podziału na podtablice (najprostszy wariant wybór pierwszego elementu tablicy nie sprawdza się w przypadku, gdy tablica jest już prawie uporzadkowana). opis wikipedia: http://pl.wikipedia.org/wiki/sortowanie_szybkie ilustracja Hungarian dance: https://www.youtube.com/watch?v=cmpaze8mx0
zadanie 6. sortowanie szybkie schemat blokowy: i:=l j:=p Algorytm opisany w postaci procedury SORTUJ (l, p) T := A (l+p) div 2 NIE T > A l TAK TAK T < A j NIE i:=i+1 j:=j-1 NIE i j TAK bufor:=a i A i :=A j A j :=bufor i:=i+1 j:=j-1 TAK i > j NIE NIE l > j TAK SORTUJ (l,j) wywołanie rekursywne procedury SORTUJ NIE i < p TAK SORTUJ (i,p) wywołanie rekursywne procedury SORTUJ
zadanie 6. sortowanie szybkie pseudopascalokod: Początek x:=pierwszy element; Powtarzaj Jeśli wskazywany element < x to przesuń go na lewo od x; Jeśli wskazywany element > x to przesuń go na prawo od x Aż do z lewej <= x i z prawej >= x; Jeśli na lewo są jakieś elementy to sortujemy je tą samą metodą; Jeśli na prawo są jakieś elementy to sortujemy je tą samą metodą Koniec
zadanie 6. sortowanie szybkie tablica początkowa: kolejne wywołania funkcji sortuj: tablica uporządkowana: