240 likes | 418 Views
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íč
E N D
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;