S třední škola stavební Jihlava Sada 1 - Základy programování 17. Řadící algoritmy Digitální učební materiál projektu: SŠS Jihlava šablony registrační číslo projektu:cz.1.09/1.5.00/34.0284 Šablona: III/2 - inovace a zkvalitnění výuky prostřednictvím ICT Jaromír Železný 2013 Projekt je spolufinancován Evropským sociálním fondem a státním rozpočtem České republiky
Řadící algoritmy slouží k setřídění jednotlivých prvků vstupního souboru (obvykle seznamu, pole) dle jejich velikosti v každém svém kroku porovnají (a případně v každém svém kroku porovnají (a případně prohodí ) dvě hodnoty ze vstupního seznamu pomocí operace menší nebo rovno, čímž zjistí jejich uspořádání v rámci výsledného seřazeného seznamu
Bubble sort Bubblesort (bublinkové řazení) je jednoduchý řadící algoritmus vylepšením bubblesortu je tzv. Shakersort (oboustranný bubble sort)
Bubble sort - princip mějme pole o N prvcích algoritmus se inicializuje (začíná) na indexu I=1 a porovnává se aktivní prvek s prvkem sousedním prvkem pokud je nižší číslo nalevo od vyššího, tak je prohodí (nižší číslo se posouvá ke konci pole) a se stejnou logikou algoritmus pokračuje na dalším indexu pokud jsou čísla ve správném pořadí, tak je neprohodí, ale pouze postoupí dále
Bubble sort - princip na konci každého průchodu posloupností se tímto způsobem na konec vždy dostane nejnižší číslo při následujícím průchodu algoritmus skončí na pozici N-1 (na poslední pozici pole je již to správné číslo), při každém následujícím opět o jednu pozici méně po N-1 průchodech (poslední bublinka je seřazena triviálně) je pole seřazeno
Bubble sort ukázka (1/2) (3 2 8 7 6) // zadání pole, budeme řadit mě od největšího k nejmenšímu (3 2 8 7 6) // začneme na pozici i=1 (3 2 8 7 6) // 3 a 2 jsou ve správném pořadí pořadí (3 2 8 7 6) // posuneme se na další index (i=2) (3 2 8 7 6) // 2 < 8, prohodíme je (3 8 2 7 6) // posuneme se na další index (i=3) (3 8 2 7 6) // 2 < 7, prohodíme je (3 8 7 2 6) // posuneme se na další index (i=4) (3 8 7 2 6) // 6 > 2, prohodíme je (3 8 7 6 2) // na pozici N je nejmenší prvek (3 8 7 6 2) // nový (druhý) průchod polem na posledním místě je nejmenší prvek, řazení tedy skončí na pozici N-1 (3 8 7 6 2) // 8 > 3, prohoďme je, posuneme se na další index (8 3 7 6 2) // 7 > 3, prohoďme je, posuneme se na další index (8 7 3 6 2) // 6 > 3, prohoďme je, na pozici N a N-1 máme 2 nejmenší
Bubble sort ukázka (2/2) (8 7 6 3 2) // nový (třetí) průchod polem, na posledním místě je nejmenší prvek, na předposledním je druhý nejmenší prvek, řazení tedy skončí na pozici N-2 (8 7 6 3 2) // 8 a 7 jsou ve správném pořadí, postoupíme na další index (8 7 6 3 2) // 7 a 6 jsou ve správném pořadí, na pozici N a N-1 a N-2 máme 3 nejmenší (8 7 6 3 2) // nový (třetí) průchod polem (8 7 6 3 2) // 8 a 7 jsou ve správném pořadí (8 7 6 3 2) // SEŘAZENO
program BubbleSort; var x : array [1..5] of integer; pomoc, I, J, N : integer; Begin N:=5; {nase pole ma 5 prvku} Writeln ('Zadej jednotlive prvky pole'); For I:=1 to N do Read (X[I]); writeln; For I := 1 to N-1 do begin for J := 1 to N-I do if (X[J+1] > X[J]) then begin pomoc := X[J+1]; X[J+1] := X[J]; X[J] := pomoc; End; End; For i:=1 to N do writeln (x[i]); readln; End. Bubble sort
Insertion sort insertionsort (řazení vkládáním) je algoritmus založený na principu porovnávání řazených hodnot a vkládání na správné místo
Insertion sort - princip mějme pole o N prvcích první prvek je triviálně ( správně ) zařazen vezmeme druhý prvek a zařadíme jej na správné místo podle velikosti vezmeme následující prvek a zařadíme jej na správné místo v již seřazených prvcích dokud pole obsahuje nezařazené prvky (dokud se neposuneme na poslední prvek), provádíme předchozí krok
Insertion sort - ukázka (3 2 8 7 6) // Zadání, prvek 3 je triviálně seřazen (3 2 8 7 6) // Vezmeme dvojku a vložíme jí na správné místo (tam už je) (3 2 8 7 6) // 8 vložíme na první místo, zbytek čísel posuneme (8 3 2 7 6) // 7 vložíme mezi 8 a 3, 3 a 2 posuneme (8 7 3 2 6) // 6 vložíme mezi 7 a 3, čísla 3 a 2 posuneme (8 7 6 3 2) // seřazeno
Insertion sort (1/3) program insertsort; var X : array[1..5] of integer; i, j, n, pozice, hodnota : integer; hotovo : boolean; begin N:= 5; {nase pole ma 5 prvku} Writeln ('Zadej jednotlive prvky pole'); For I:=1 to N do Read (X[I]); writeln;
Insertion sort (2/3) for j :=1 to N do begin hodnota := X[i]; pozice := i; hotovo := false; while not hotovo do begin if pozice <= 1 then end; else hotovo := true if hodnota >= X[pozice-1] then else hotovo := true begin end; X[pozice] := hodnota; end; X[pozice] := X[pozice-1]; pozice := pozice-1 ;
Insertion sort (3/3) {na zaver program vypise serazene pole} for i := 1 to n do write(x[i],' '); readln; readln; end.
Selectionsort Selectionsort (řazení výběrem) je jednoduchý řadící algoritmus v porovnání s dalšími kvadratickými algoritmy je selectionsort v obecném případě rychlejší než bubble sort, avšak pomalejší než insertion sort
Selection sort Selectionsort vychází z myšlenky, že pokud řadíme pole od největšího prvku k nejmenšímu, tak první bude nejvyšší prvek, za ním nejvyšší prvek ze zbytku pole atd. potom pouze postupně vybíráme nejvyšší prvky z neseřazené části pole a umísťujeme je na konec již seřazené části pole
Selection sort - ukázka (3 2 8 7 6) // zadání pole, řadíme od největšího k nejmenšímu (3 2 8 7 6) // nejvyšší je 8, prohodíme ho tedy s 3 na pozici 1 (8 2 3 7 6) // nejvyšší je 7, prohodíme ho tedy s 2 na pozici 2 (8 7 3 2 6) // nejvyšší je 6, prohodíme ho tedy s 3 na pozici 3 (8 7 6 2 3) // nejvyšší je 3, prohodíme ho tedy s 2 na pozici 4 (8 7 6 3 2) // seřazeno
Selection sort (1/3) program SelectSort; var X : array [1..5] of integer; I, J, PomocX, PomocI, N : integer; begin N:= 5; {nase pole ma 5 prvku} Writeln ('Zadej jednotlive prvky pole'); For I:=1 to N do Read (X[I]); writeln;
Selection sort (2/3) for I := 1 to N - 1 do begin pomoci:=i; pomocx:=x[i]; for J := (I + 1) to N do begin if (X[J] > PomocX) then begin PomocX := X[j]; PomocI := j; end; end; PomocX := X[i]; X[i] := X[PomocI]; X[PomocI] := PomocX; end;
Selection sort (3/3) {na zaver program vypise serazene pole} for i := 1 to n do write(x[i],' '); readln; end.
Řadící algoritmy - závěr největší část algoritmů řazení je založena na porovnávání dvojic prvků jedná se o univerzální metodu, kterou lze seřadit libovolná data v libovolné reprezentaci (stačí příslušná relace uspořádání) pro některé konkrétní reprezentace nějak vymezené množiny dat lze sestrojit algoritmy, které fungují na jiném principu, např. na základě reprezentace řazených čísel v poziční číselné soustavě
Zdroje: TurboPascal 6.0 - příručka uživatele (help) http://www.algoritmy.net/article/3/bubble-sort http://www.algoritmy.net/article/8/insertion-sort http://www.algoritmy.net/article/4/selection-sort Literatura: Radek HYLMAR: Programování pro úplné začátečníky, ComputerPress, Brno, 2009, ISBN 978-80-251-2129-0 Januš DRÓZD, Rudolf KRYL: Začínáme s programováním, GRADA a.s., Praha, 1992, ISBN 80-85424-41-X Tomáš HRUŠKA: Pascal pro začátečníky, SNTL, Praha 1989, ISBN 80-03- 00345-8 Materiál je určen k bezplatnému používání pro potřeby výuky a vzdělávání na všech typech škol a školských zařízení. Autorem materiálu a všech jeho částí, není-li uvedeno jinak, je : Jaromír Železný Pokud není uvedeno jinak, byly při tvorbě použity volně přístupné internetové zdroje. Autor souhlasí se sdílením vytvořených materiálů a jejich umístěním na www.ssstavji.cz.