Třídění
Třídění. Seminář IVT. Definice. uspořádání skupiny dat (záznamů) dle daného klíče vzestupně (od nejmenší do největší hodnoty klíče) sestupně (od největší do nejmenší hodnoty klíče) příklady data žáků, pracovníků, … jistých osob dle příjmení a jména (podle abecedy) – kombinovaný klíč
Třídění
E N D
Presentation Transcript
Třídění Seminář IVT
Definice • uspořádání skupiny dat (záznamů) dle daného klíče • vzestupně (od nejmenší do největší hodnoty klíče) • sestupně (od největší do nejmenší hodnoty klíče) • příklady • data žáků, pracovníků, … jistých osob dle • příjmení a jména (podle abecedy) – kombinovaný klíč • data narození • místa bydliště • knihy v knihovně dle • autora • žánru
Druhy třídění • vnitřní • všechna tříděná data se vejdou do paměti • rychlost třídění závisí jen na počtu porovnání a výměn dat • vnější • data se do paměti nevejdou • třídí se po částech, setříděné části odkládají zpět do vnější paměti, pak se vše postupně slučuje • rychlost třídění závisí na počtu porovnání, výměn dat a přístupové rychlosti vnějších pamětí (disku)
Metody • stabilní - zachovává vzájemné pořadí údajů se shodnými primárními klíči – tj. třídíme-li osoby dle příjmení a bude se vyskytovat více osob stejného příjmení, zachová se ve výsledku jejich pořadí dle původních dat • přirozená, pokud doba potřebná ke třídění již setříděné posloupnosti je menší než doba, potřebná pro setřídění náhodně uspořádané posloupnosti.
Požadavky na algoritmus • jednoduchost • přirozenost • stabilita • časová složitost co možná nejmenší • paměťová náročnost
Algoritmy s časovou složitostí O(N2) kvadratická složitost • Select Sort • Bubble Sort • Shaker Sort • Insert Sort třídíme v původní poli, nepotřebujeme další pomocné pole
Select Sort Třídění výběrem– opakovaný výběr největšího (nejmenšího) prvku z dosud nesetříděné posloupnosti a jeho přehození s posledním (prvním) prvkem • průchod polem – v n-prvkovém poli najdeme maximum a prohodíme tento prvek s posledním n-tým prvkem • průchod polem –v poli s (n-1) prvky opět najdeme maximum a prohodíme tento prvek s posledním tj. (n-1). prvkem • průchod polem –v poli s (n-2) prvky opět najdeme maximum a prohodíme tento prvek s posledním tj. (n-2). prvkem … pokračujeme, dokud nezbude jen jediný prvek – ten už je na svém místě
Select Sort Start i = n, n-1 … 2 Stop max = 1 j = 2, 3, … i tmp = A[i] A[i] = A[max] - A[j] > A[max] A[max] = tmp + max = j
SelectSort procedure SelectSort ( var A: TPole ; N : word); var I, J, max : word; tmp : TPrvek; {typ prvku pole} begin for I := N downto 2 dobegin max := 1 ; for J := 2 to I do begin if A[J] > A[max] then max := J end; tmp := A[I]; A[I] := A[max]; A[max] := tmp end end;
Bubble Sort třídění probubláváním – porovnávají se vždy prvky ležící vedle sebe – je-li levý prvek větší než pravý, prohodí se • průchod polem– n-prvkové pole – porovná se první prvek s druhým, je-li první větší než druhý, prohodí se. Porovná se druhý se třetím (event. se prohodí), třetí se čtvrtým …Touto cestou se na pozici posledního tj n. prvku dostane největší prvek • průchod polem – (n-1) prvkové pole – opět se porovnává první s druhým, druhý s třetím atd. na pozici (n-1). prvku se dostane – probublá – 2. největší prvek … pokračujeme, dokud nezbude jen jediný prvek – ten už je na svém místě Zkrácení algoritmu – kontrolujeme, zda došlo k výměně – pokud nikoliv, je celé pole setříděno!!!
Bubble Sort – delší verze Start i = 1, 2 … n - 1 Stop j = 1, 2, … n - i - A[j] > A[j + 1] + tmp = A[j] A[j] = A[j+1] A[j+1] = tmp
Bubble Sort procedure BubbleSort ( var A: TPole ; N : word); var I, J : word; tmp : TPrvek; begin for I := 1 to N - 1 do for J := 1 to N - i do if A[J] > A[J+1] thenbegin tmp := A[J]; A[J] := A[J+1]; A[J+1] := tmp end; end;
Bubble Sort – zkrácená verze Start i = 1, 2 … n -1 Stop vymena = false j = 1, 2, … n - i - A[j] > A[j + 1] + - vymena Stop tmp = A[j] A[j] = A[j+1] A[j+1] = tmp + vymena = true
Bubble Sort – zkrácená verze procedure BubbleSort ( var A: TPole ; N : word); var I, J : word; tmp : TPrvek; vymena : boolean; begin for I := 1 to N - 1 do begin vymena := false; for J := 1 to N - i dobegin if A[J] > A[J+1] thenbegin vymena := true; tmp := A[J]; A[J] := A[J+1]; A[J+1] := tmp end; end; ifnot vymena thenbreak; end; end;
Shaker Sort třídění setřásáním – podobné jako BUBBLE SORT, ale střídavě se prochází oboustranně • průchod polem– zprava – porovná se poslední s předposledním, předposlední s předpředposledním … • průchod polem – zleva – porovnává se první s druhým, druhý s třetím atd. nyní máme na prvním a posledním místě správné prvky – nejmenší a největší pokračujeme v poli s n-2 prvky Zkrácení algoritmu – pamatujeme si, u jakého prvku došlo k výměně
Shaker Sort – setřásání Start L=2 R = n L = L+1 1 j = R, R-1, … L j = L, L+1, … R R = R - 1 - A[j] < A[j - 1] - A[j] < A[j - 1] L > R - + + 1 + tmp = A[j] A[j] = A[j -1] A[j -1] = tmp tmp = A[j] A[j] = A[j -1] A[j -1] = tmp Stop
Shaker Sort var I, J , L, R : word; tmp : TPrvek; begin L := 2; R := N; repeat for J := R downto L do begin if A[J-1] > A[J] thenbegin tmp := A[J-1]; A [J-1] := A[J]; A[J] := tmp; end; end; L := L+1; for J := L to R do if A[J-1] >A[J] thenbegin tmp :=A[J-1]; A[J-1] := A[J]; A[J] := tmp; end; end; R := R - 1; until L > R end;
Shaker Sort – setřásání zkráceně Start L=2 R = n K = n L = K+1 1 j = R, R-1, … L j = L, L+1, … R R = K - 1 - A[j] < A[j - 1] - A[j] < A[j - 1] L > R - + + 1 + tmp = A[j] A[j] = A[j -1] A[j - 1] = tmp K = j tmp = A[j] A[j] = A[j - 1] A[j -1] = tmp K = j Stop
Shaker Sort - zkráceně var I, J , L, R, K : word; tmp : TPrvek; begin L := 2; R := N; repeat for J := R downto L do begin if A[J-1] > A[J] thenbegin tmp := A[J-1]; A [J-1] := A[J]; A[J] := tmp; K := J ; end; end; L := K+1; for J := L to R do if A[J-1] >A[J] thenbegin tmp :=A[J-1]; A[J-1] := A[J]; A[J] := tmp; K := J ; end; end; R := K - 1; until L > R end;
Insert Sort třídění zatřiďováním – jednotlivé prvky se postupně zatřiďují do již setříděné části pole • zatřiďování z pravého konce setříděného pole (se zarážkou – nárazníkem) • binární zatřiďování
Insert Sort Start i = 2, 3 … n Stop X = A[i] A[0] = X j = i - 1 X < A[j] - A[j+1] = X + A[j+1] = A[J] j = j – 1
Insert Sort procedureInsertSort ( var A: TPole ; N : word); var I,J : word; X : TPrvek; begin for I := 2 to N dobegin X := A[I]; A[0] := X; J := I-1; while X<A[J] dobegin A[J+1] := A[J]; J := J-1 end; A[J+1] := X end end;
Binary Insert Sort Start i = 2, 3 … n Stop X = A[i] j = i, i - 1 … L+1 L = 1 R = i – 1 A[j] = A[j-1] M = int(L + R)/2 X < A[M] - A[L] =X L = M + 1 + R = M – 1 + - L >R
Binary Insert Sort - složitost n.log(n) procedure BinaryInsertSort(var A : TPole ; N : word) ; var i, j, L, R, M: word; X : TPrvek; begin for i := 2 to N dobegin X := A[i]; L:= 1; R:= i-1; whileL <= Rdobegin M:= (L + R) div 2; if X < A[M] then R:= M - 1 else L:= M + 1; end; for j := idowntoL + 1do A[j] := A[j - 1]; A[L] := X; end end;