Upload
urania
View
48
Download
5
Embed Size (px)
DESCRIPTION
Algoritmy a programovac í techniky. Gymnázium, Brno, Vídeňská 47. Třídící algoritmy (obecná charakteristika). tříděním (resp. řazením ) rozumíme uspořádání množiny dat podle zvolené klíčové položky (vzestupně nebo sestupně podle velikosti) - PowerPoint PPT Presentation
Citation preview
Algoritmy a programovací techniky
Gymnázium, Brno, Vídeňská 47
Třídící algoritmy(obecná charakteristika)
tříděnímtříděním (resp. (resp. řazenímřazením) rozumíme ) rozumíme uspořádání množiny dat podle zvolené uspořádání množiny dat podle zvolené klíčové položky (vzestupně nebo sestupně klíčové položky (vzestupně nebo sestupně podle velikosti)podle velikosti)
se setříděnými daty se lépe pracuje se setříděnými daty se lépe pracuje (především je (především je usnadněno usnadněno pozdější pozdější vyhledávánívyhledávání))
Třídící algoritmy(obecná charakteristika)
• v programech obvykle třídíme objekty, které lze v programech obvykle třídíme objekty, které lze popsat popsat datovou strukturou datovou strukturou typutypu záznam záznam (v Pascalu) (v Pascalu)
• v takové struktuře bývá označena jedna položka jako v takové struktuře bývá označena jedna položka jako klíčová (klíčová (klíčklíč))
• podle klíče sepodle klíče se pak pak záznamy řadí záznamy řadí (vzestupně nebo (vzestupně nebo sestupně)sestupně)
• ostatní položkyostatní položky jsou z hlediska třídění nevýznamné, jsou z hlediska třídění nevýznamné, pouze pouze se přemisťujíse přemisťují
Třídící algoritmy(základní rozdělení)
Vnitřní třídění
• použijeme tehdy, pokud lze množinu tříděných dat použijeme tehdy, pokud lze množinu tříděných dat umístit do vnitřní paměti počítačeumístit do vnitřní paměti počítače
• data jsoudata jsou uložena uložena v poliv poli a algoritmy využívají možnosti a algoritmy využívají možnosti přímého přístupu k jednotlivým prvkům (třídění polí)přímého přístupu k jednotlivým prvkům (třídění polí)
Vnější tříděníVnější třídění
• použijeme tehdy, kdy se tříděná data nevejdou do použijeme tehdy, kdy se tříděná data nevejdou do vnitřní pamětivnitřní paměti
• data jsoudata jsou umístěna umístěna v souborechv souborech na vnějším na vnějším paměťovém médiupaměťovém médiu
• třídění je založeno na opakovaném čtení a vytváření třídění je založeno na opakovaném čtení a vytváření souborůsouborů
Algoritmy vnitřního třídění(definice typů a konstant)
const Max = … {maxim{maximální rozsah poleální rozsah pole}}
type TPolozka = integer; TPole = array [0..Max] of
TPolozka;
• pro jednoduchost budeme v třídit položky typu pro jednoduchost budeme v třídit položky typu integerinteger
• vstupní posloupnostvstupní posloupnost je do pole ukládána od pozice s je do pole ukládána od pozice s indexem indexem 11
• pozice s indexempozice s indexem 0 0 je využívána v některých je využívána v některých metodách metodách k pomocným účelůmk pomocným účelům
Algoritmy vnitřního třídění(metody)
Třídění přímým výběrem (SelectSort)Třídění přímým výběrem (SelectSort)
Třídění přímým vkládáním (InsertSort)Třídění přímým vkládáním (InsertSort)
Třídění přímou výměnou (BubbleSort)Třídění přímou výměnou (BubbleSort)
Třídění přetřásáním (ShakerSort)Třídění přetřásáním (ShakerSort)
Třídění binárním vkládáním (Binary Třídění binárním vkládáním (Binary InsertSort)InsertSort)
Třídění rozdělováním (QuickSort)Třídění rozdělováním (QuickSort)
Algoritmy vnitřního třídění
Třídění přímým výběrem (SelectSort)
SelectSort(popis metody)
tříděná posloupnost je rozdělená na dvě části
z nesetříděné části vybíráme minimální prvek
tento prvek je vložen na první místo nesetříděné části
velikost setříděné části se tak zvýší o jeden prvek
PříkladPříklad ImplementaceImplementace
754321 427135
hledání minima v nesetříděné části…hledání minima v nesetříděné části…setsetříděná posloupnostříděná posloupnostnnesetesetříděná vstupní posloupnostříděná vstupní posloupnost
min
SelectSort(příklad)
min min min min min
Popis metodyPopis metody ImplementaceImplementace
SelectSort(implementace)
procedure SelectSort (var A : TPole; N : integer); {N…počet prvků pole}
var i,j,k : integer; {indexy prvků} X : TPolozka; {pomocná proměnná pro výměnu prvků}
beginfor i:=1 to N-1 do
begin k:=i; {k…index 1. prvku nesetříděné části}
j:=i+1 to N do if A[j]<A[k] then k:=j; if k>i then
begin X:=A[k]; A[k]:=A[i]; A[i]:=X end endend;
PříkladPříklad Popis metodyPopis metody
Algoritmy vnitřního třídění
Třídění přímým vkládáním (InsertSort)
InsertSort(popis metody)
princip je podobný metodě, jakou si karetní hráč obvykle seřazuje karty v ruce, když po rozdání karet bere karty ze stolu jednu po druhé a vkládá je mezi už seřazené karty
posloupnost tříděných položek je opět rozdělena na setříděnou a nesetříděnou část
z nesetříděné části vybíráme prvky a zařazujeme je do setříděné části tak, aby tato část zůstala setříděná
tento postup opakujeme tak dlouho, dokud není nesetříděná část prázdná
PříkladPříklad ImplementaceImplementace
754321
nnesetesetříděná vstupní posloupnostříděná vstupní posloupnost
23714 427135
hledání pozice v setříděné části…hledání pozice v setříděné části…setsetříděná posloupnostříděná posloupnost
InsertSort(příklad)
zarážka
Popis metodyPopis metody ImplementaceImplementace
k zatříděník zatříděník zatříděník zatříděník zatřídění
InsertSort(implementace)
procedure InsertSort (var A : TPole; N : integer); {N…počet prvků pole}
var i, j : integer; {indexy prvků}
beginfor i:=2 to N do {zatřiďujeme číslo z pozice i}
begin A[0]:=A[i]; {A[0]… zarážka potřebná v případě, kdy
zatřiďovaný j:=i-1; prvek patří podle velikosti na začátek setříděné části}
while A[i]<A[j] do beginA[j+1]:=A[j] j:=j-1;
end A[j+1]:= A[i];
endend;
PříkladPříklad Popis metodyPopis metody
Algoritmy vnitřního třídění
Třídění přímou výměnou (BubbleSort)
BubbleSort(popis metody)
PříkladPříklad ImplementaceImplementace
pole je opět rozděleno na část setříděnou a nesetříděnou
opakovaně porovnáváme sousední prvky v nesetříděné části pole
jestliže testovaná dvojice není uspořádaná, pak vyměníme pozice testovaných prvků
výsledkem je “probublání” minimálního prvku nesetříděné části na její začátek
velikost setříděné části se tak zvýší o jeden prvek
312315 754 427
setsetříděná posloupnostříděná posloupnostnnesetesetříděná vstupní posloupnostříděná vstupní posloupnost
BubbleSort(příklad)
Popis metodyPopis metody ImplementaceImplementace
porovnávání a výměna sousedních porovnávání a výměna sousedních prvků...prvků...
BubbleSort(implementace)
procedure BubbleSort (var A : TPole; N : integer); {N…počet prvků pole}
var i, j : integer; {indexy prvků}
X : TPolozka; {pro výměnu prvků}
beginfor i:= 2 to N do
begin for j:= N downto i do
if A[j]<A[j-1] do begin {vyměnit sousední prvky?}
X:=A[j];A[i]:=A[j-1];A[j-1]:=X;
end; end
end;PříkladPříklad Popis metodyPopis metody
BubbleSort(možnosti optimalizace algoritmu)
321 457
vstupní posloupnost dat
po “probublání” prvního prvku (č. 4)
321 574
• velká část pole je už po prvním “probublání” setříděna • stačí tedy “zapamatovat” si pozici (index) poslední
výměny• část pole od tohoto indexu je setříděná• následující “probublávání” stačí tedy provádět k této
pozici
pozice poslední výměny prvků
BubbleSort(možnosti optimalizace algoritmu)
321 745
vstupní posloupnost dat
“probubláním” jediného prvku (4) se celá posloupnost setřídí
321 754
algoritmus lze tedy ukončit poté, co během “probublávání” libovolného prvku nenastane výměna
během následujícího “probublávání” prvku (7) nenastane žádná výměna
321 754
BubbleSort(implementace efektivního algoritmu)
procedure BubbleSort (var A : TPole; N : integer); {N…počet prvků pole}
var i, j, Pozice : integer; {i,j…indexy prvků, Pozice…index poslední výměny}
X : TPolozka; {pro výměnu prvků}
Vymena : boolean; {informace o tom, zda nastala během “probublávání” výměna}
begini:= 2;repeat
Vymena:=true; for j:= N downto i do
if A[j]<A[j-1] do begin {vyměnit sousední prvky?} X:=A[j]; A[i]:=A[j-1]; A[j-1]:=X; Vymena:=false; {nastala výměna} Pozice:=j; {pozice zatím poslední výměny} end;
i:=Pozice;until Vymena
end;
Algoritmy vnitřního třídění
Třídění přetřásáním (ShakerSort)
ShakerSort(popis metody)
PříkladPříklad ImplementaceImplementace
modifikace bublinového třídění
metoda prochází pole střídavě zleva-doprava (na konec nesetříděné části pole “probublá” maximální prvek) a zprava-doleva (na začátek nesetříděné části pole “probublá” minimální prvek)
setříděné části jsou v průběhu třídění na obou koncích pole a při ukončení třídění se obě části spojí
71
porovnávání a výměna sousedních prvků porovnávání a výměna sousedních prvků zleva dopravazleva doprava ......
2
porovnávání a výměna sousedních prvků porovnávání a výměna sousedních prvků zprava dolevazprava doleva......
23 4 5 741
setsetříděná posloupnostříděná posloupnostnnesetesetříděná vstupní posloupnostříděná vstupní posloupnost
5 3
ShakerSort(příklad)
Popis metodyPopis metody ImplementaceImplementace
ShakerSort(implementace)
procedure ShakerSort (var A : TPole; N : integer); {N…počet prvků pole}
var i, j : integer; {indexy prvků}
X : TPolozka; {pro výměnu prvků}
beginfor i:= 2 to N do
begin for j:= N downto i do {probublávání zleva doprava}
if A[j]<A[j-1] do begin {vyměnit sousední prvky?} X:=A[j]; A[i]:=A[j-1]; A[j-1]:=X; end;
for j:= i to N- i do {probublávání zprava doleva} if A[j]>A[j+1] do begin {vyměnit sousední prvky?}
X:=A[j]; A[i]:=A[j+1]; A[j+1]:=X; end;
endend;
PříkladPříklad Popis metodyPopis metody
ShakerSort(optimalizace)
Tuto metodu lze podobně jako bublinkové tříděníTuto metodu lze podobně jako bublinkové tříděníoptimalizovat dvěma způsoby:optimalizovat dvěma způsoby:
• pamatovat si pamatovat si index poslední výměny (v obou index poslední výměny (v obou směrech)směrech) a od této pozice začít probublávat a od této pozice začít probublávat opačným směremopačným směrem
• evidovat, zdaevidovat, zda během probublávání během probublávání nastala nějaká nastala nějaká výměnavýměna, pokud nenastala je pole setříděno a lze , pokud nenastala je pole setříděno a lze provádění algoritmu ukončitprovádění algoritmu ukončit
Algoritmy vnitřního třídění
Třídění binárním vkládáním (Binary InsertSort)
Binary InsertSort(popis metody)
PříkladPříklad ImplementaceImplementace
Při třídění vkládáním je možné pozici zatřiďovaného prvku v nesetříděné části posloupnosti najít efektivněji metodou binárního vyhledávání (metoda půlení intervalů).
setsetříděná posloupnostříděná posloupnostnnesetesetříděná vstupní posloupnostříděná vstupní posloupnosthledání pozice v setříděné části…hledání pozice v setříděné části…
754321
k zatříděník zatříděník zatříděník zatříděník zatřídění MMM
Binary InsertSort(příklad)
Popis metodyPopis metody ImplementaceImplementace
L R L LLR RRR
M
3 1 7 2 45
Binary InsertSort(implementace)
procedure BinaryInsert (var A : TPole; N : integer); {N…počet prvků pole}
var i, j, m, l, r, x : integer;
beginfor i:=2 to N do {zatřiďujeme číslo z pozice i}
begin x:=A[i]; l:=1; r:=i-1; {nastavení levého a pravého ukazatele} while l<=r do begin {cyklus binárního vyhledání}
m:=(l+r) div 2; if x<A[m] then r:=m-1
else l:=m+1; end
for j:= i-1 downto l do A[j+1]:= A[i]; {posun části pole} A[l]:=x; {zařazení}
endend;
PříkladPříklad Popis metodyPopis metody
Algoritmy vnitřního třídění
Třídění na principu rozdělování (Quicksort)
• tato metoda je založena na principu rozdělení pole na dvě části
• pro každý prvek x z jedné části pole platí x<y, kde y je libovolný prvek z druhé části
• nejvýhodnější dělící hodnotou pole je medián (právě polovina prvků pole je menší než medián a polovina větší)
• nalezení mediánu je však časově náročné, proto se volí jiný prvek – střed pole
QuickSort(popis metody)
PříkladPříklad ImplementaceImplementace
7
poro
vnávám
e
poro
vnávám
e
169 10 922 135
QuickSort(příklad)
10
střed
1512 615 5312 7
střed
Stejný algoritmus dělení aplikujeme zvlášť na „žlutou“ a zvlášť na „červenou“ část.
Popis metodyPopis metody ImplementaceImplementace
Dělení provádíme tak dlouho nezískáme jednoprvkové úseky.
QuickSort(implementace)
PříkladPříklad Popis metodyPopis metody
procedure QuickSort (var A : TPole; L,R : integer); {N…počet prvků pole}var i, j, pom: integer;begin
i:=L; j:=R;x:=A[(i+j) div 2]; {určení dělící hodnoty}repeat
while A[i]<x do i:=i+1; {hledá zleva, nalezne nejblíže vyšší i, pro které platí A[i]>=x }
while A[j]<x do j:=j-1; {hledá zprava, nalezne nejblíže nižší j, pro které platí A[j]<=x } if i<=j then begin
pom:=A[i]; A[i]:=A[j];A[j]:=pom; i:=i+1; j:=j-1; end
until i>jif L<J then QuickSort (A,L,J);if I <R then QuickSort (A,i, ,R)
end;
Algoritmy vnějšího třídění
• slouží k uspořádání rozsáhlých souborů dat
• aplikujeme je tehdy, nevejdou-li se všechna tříděná data do operační paměti a nelze použít některou z metod vnitřního třídění
• tříděná data jsou uložena v souborech na nějakém vnějším paměťovém médiu
Algoritmy vnějšího třídění
• podstatou je přesouvání tříděných údajů mezi sekvenčními soubory dat
• při tomto přesouvání se data třídí po částech, vytvářejí se tak postupně delší a delší setřídění úseky (tzv. běhy), až jsou nakonec všechna data setříděna v jednom souboru
• při práci se sekvenčními soubory, na rozdíl od práce s polem, je v každém okamžiku přístupný pouze jediný prvek souboru
Algoritmy vnějšího třídění
Přímé slučování(3-pásková, 2-fázová metoda)
Přirozené slučování(3-pásková, 2-fázová metoda)
Vyvážené slučování (4-pásková, 1-fázová metoda)
Algoritmy vnějšího třídění
Přímé slučování
Přímé slučování (popis metody)
• nejjednodušší metoda, je však zbytečně pomalá a prakticky se nepoužívá
• ze všech tříděných čísel vytvoříme nejprve uspořádané dvojice, z nich pak sloučením vzniknou čtveřice, osmice,..., až budou všechna čísla setříděna
• obecně po k-tém kroku výpočtu získáme soubor setříděných úseků (běhů) délky 2k
• každý krok výpočtu se skládá ze dvou fází – z fáze rozdělovací a z fáze slučovací
Přímé slučování (popis metody – rozdělovací fáze)
• V této fázi rozdělíme setříděné úseky (běhy) ze vstupního souboru do 2 pomocných souborů.
• Do každého překopírujeme polovinu běhů ze vstupního souboru. Protože nevíme kolik běhů bude, zapisujeme je do pomocných souborů střídavě.
• Je-li počet setříděných úseků lichý, bude v jednom z pomocných souborů o jeden běh více.
Přímé slučování (popis metody – slučovací fáze)
• V této fázi vytváříme z pomocných souborů výsledný výstupní soubor.
• Nejprve sloučíme první běhy z pomocných souborů do jednoho běhu dvojnásobné délky a ten zapíšeme do výstupního souboru. Totéž uděláme s druhými běhy, atd.
• Pokud je v jednom pomocném souboru o 1 běh více, do výstupního souboru ho překopírujeme .
Přímé slučování (příklad)
287 6 49 1030 1 5soubor C :
soubor A :
soubor B :
7 6 49 31
28 100 5
fáze rozdělovací
fáze slučovací
soubor C : 7 6 49 31 28 100 5
Přímé slučování (příklad)
287 6 40 1039 1 5soubor C :
soubor A :
soubor B :
7 6 108 21
30 49 5
fáze rozdělovací
fáze slučovací
soubor C : 7 649 31 28 100 5
Přímé slučování (příklad)
270 4 108 639 1 5soubor C :
soubor A :
soubor B :
0 4 67 98
31
10
2 5
fáze rozdělovací
fáze slučovací
soubor C : 1 643 85 72 100 9
Přímé slučování (příklad)
710 4 102 683 5 9soubor C :
soubor A :
soubor B :
0 5 71 32
104
8
6
9
fáze rozdělovací
fáze slučovací
soubor C : 1 983 64 52 100 7
Algoritmy vnějšího třídění
Přirozené slučování
Přirozené slučování (popis metody)
• zefektivnění přímého slučování
• využijeme částečného uspořádání vstupního souboru
• setříděnými úseky (běhy) v tomto případě nejsou 2k-tice, ale nejdelší možné setříděné úseky
Přirozené slučování (příklad)
287 6 49 1030 1 5soubor C :
soubor A :
soubor B :
7
6
48
10
9
20 51 3
fáze rozdělovací
fáze slučovací
soubor C : 0 9 43 75 61 102 8
Přirozené slučování (příklad)
610 9 42 1073 5 8soubor C :
soubor A :
soubor B :
0 9
4
1 102 63 85 7
fáze rozdělovací
fáze slučovací
soubor C : 0 8 103 64 51 92 7
Přirozené slučování (optimalizace)
• data v souboru můžeme předtřídit
• takové množství dat ze vstupního souboru, které se nám vejde ještě do operační paměti, setřídíme některou z metod vnitřního třídění a zapíšeme zpět do souboru
• získáme tak soubor relativně dlouhých setříděných úseků
Algoritmy vnějšího třídění
Vyvážené slučování
Optimalizace (vyvážené slučování)
• rozdělovací fáze je zbytečná, přitom časová náročnost je přibližně stejná, jako u fáze slučovací
• spojením slučovací a rozdělovací fáze zdvojnásobíme rychlost výpočtu
• princip:sloučené běhy nezapisujeme do jednoho výstupního souboru, ale hned je rozdělujeme střídavě do dvou souborů
• rozdělovací fáze proběhne jen jednou, na začátku výpočtu
Vyvážené slučování (4-pásková, 1-fázová metoda)
287 6 49 1030 1 5soubor C :
soubor A :
soubor B :
7
6
48
10
9
20 51 3
fáze rozdělovací
Vyvážené slučování (4-pásková, 1-fázová metoda)
soubor C :
soubor A :
soubor B :
7
6
48
10
9
20 51 3
fáze slučovací i rozdělovací
soubor D :
0 21 3 65 7 8 9
4
10
Vyvážené slučování (4-pásková, 1-fázová metoda)
soubor A :
soubor C :
soubor D :
fáze slučovací i rozdělovací
0 21 3 65 7 8 9
4
10
0 21 3 65 7 8 94 100 21 3 65 7 8 94 10
setříděná posloupnost