Řazení dat - algoritmy a řadící metody
21. prosince 1998   skrivan@fi.muni.cz


Řazení dat patří k nejčastějším programátorským úkolům. Seřadit data potřebujeme všude tam, kde je nutné ze změti údajů zadaných postupně uživatelem získat nějaký přehledný výsledek, např. seznam setříděný podle abecedy. Řadících metod je velká spousta, uvedu zde ty nejběžnější, teoretický výklad je doplněn praktickými ukázkami v jazyce Pascal.

Obsah

  1. Základní pojmy
  2. Metoda přímého výběru
  3. Metoda přímého vkládání
  4. Quick Sort
  5. Bubble Sort


1. Základní pojmy

Řadící metoda
Je obecně postup, jehož provedením získáme setříděný výsledek podle daného kritéria. Každá řadící metoda má svůj odlišný postup, jakým dá setříděná data na výstup.
Přirozenost metody
Řadící metoda se nazývá přirozená, jestliže doba potřebná k seřazení již seřazené podmnožiny údajů je menší, než doba potřebná na seřazení zbývající neuspořádané podmnožiny. Pokud tato podmínka není splněna, pak se metoda označuje za nepřirozenou.
Stabilita algoritmu
Algoritmus je stabilní, jestliže zachovává stejné pořadí záznamů se stejným klíčem. Tato vlastnost je požadována v těch případech, ve kterých skupiny záznamů se stejnou hodnotou klíčové položky ještě uvnitř řadíme podle jiného klíče.
Rychlost algoritmu
Někdy také nazývána algoritmická složitost, lze chápat jako počet provedení porovnání klíčových položek, která jsou nutná pro získání uspořádaní posloupnosti. Algoritmická složitost pro N záznamů je: Už snad jenom pro upřesnění, časově nejvýhodnější je složitost logaritmická, nejhorší případ je složitost faktoriální a jí podobné.


2. Metoda přímého výběru

Předpokládejme, že část pole od indexu 1 až po K je seřazená a část od K+1 do N neseřazená. V posloupnosti od K+1 do N nalezneme minimální prvek (nech je nalezen na pozici M). Potom tedy prohodíme M-tý prvek s K+1ním prvkem a za seřazenou považujeme posloupnost od 1 do K+1. Na začátku je uspořádaná posloupnost prázdná, tj. hledáme minimum z prvků od 1 do K+1 a nalezený prvek prohodíme s 1. položkou.
Metoda nepatří mezi stabilní, a ani není žádným rychlíkem.

 var i, j, k: index;
     x, pom: prvek;
     a: array [index] of prvek;

 begin
       for j:=1 to n do
        begin
             x:=a[j];
             k:=j;
             for i:=j+1 to n do
              if x<a[i] then begin x:=a[i]; k:=i; end;
             pom:=a[i];
             a[i]:=a[k];
             a[k]:=pom;
             inc(j);
        end;
 end.
              


3. Metoda přímého vkládání

Předpokládejme, že část pole od indexu 1 až po K je setříděná. Vezmeme K+1 prvek a vložíme jej na správné místo do již uspořádané posloupnosti a za seřazenou považujeme posloupnost od 1 do K+1. Na začátku považujeme za uspořádanou posloupnost pouze prvek 1.
Metoda se chová přirozeně a je stabilní. Avšak mezi rychlé metody zrovna nepatří.

 var i, j: index;
     x: prvek;
     a: array [index] of prvek;

 begin
 	for i:=2 to n do
         begin
              x:=a[i];
              a[0]:=x;
              j:=i-1;
              while x<a[j] do
               begin
                    a[j+1]:=a[j];
                    dec(j);
               end;
              a[j+1]:=x;
         end;
 end.
      


4. Quick Sort

Metoda Quick Sort je založená na rekurzi. Využívá principu dělení řazeného pole. Řazené pole rozdělíme na dvě části A a B, pro které bude platit, že všechny prvky z A jsou menší než libovolný prvek z B. Toto provádíme rekurzivně tak dlouho, dokud celé pole není seřazené. Část algoritmu, která provádí rozdělování pole na části A a B, může pracovat např. tak, že hledá zleva nejbližší další prvek, který je větší nebo roven dělící hodnotě x, a hledá zprava nejbližší další prvek, který je menší nebo roven dělící hodnotě x. Tyto prvky se vzájemně vyměňují. V této činnosti se pokračuje tak dlouho, dokud proti sobě postupující indexy, pomocí kterých se prochází řazená část pole, nepřekříží. Hodnota x se obvykle volí jako prostřední prvek. (tzv. medián)
Metoda není stabilní a nepracuje přirozeně. Je však jednou z nejrychlejších řadících metod, i když může být někdy na obtíž přítomná rekurze.

 var a: array [index] of prvek;
     n: index;

 procedure rozdel(l: index; var i,j: index; r: index);
 var w: prvek;
 begin
      i:=l;
      j:=r;
      x:=a[(l+r) div 2];
      repeat
      	    while a[i]<x do inc(i);
            while x<a[j] do dec(j);
            if i<=j then
             begin
             	   w:=a[i];
                   a[i]:=a[j];
                   a[j]:=w;
                   inc(i);
                   dec(j);
             end;
      until i>j;
 end;

 procedure trid(l,r: index);
 var i,j: index;
 begin
      rozdel(l,i,j,r);
      if l<j then trid(l,j);
      if i<r then trid(i,r);
 end;

 BEGIN
      trid(1,n);
 END.



5. Bubble Sort

Bublinkové třídění je v principu podobné jako metoda přímého výběru, rozdíl je ve vyhledávání minima a jeho záměna s prvním prvkem neseřazené podposloupnosti. Neseřazená část pole se prochází zprava doleva a porovnávají se postupně každé dva sousední prvky pole - nejsou-li vzájemně seřazeny ve smysly výsledného řazení, vymění se.
Co se týče rychlosti, jde snad o nejhorší řadící metodu. Vhodná je jenom k otestování, zda daná posloupnost je uspořádaná, nebo v takovém případě metoda projde posloupností pouze jednou.

 var i,j: index;
     x: prvek;
     a: array [index] of prvek;

 begin
      for i:=2 to n do
       for j:=n downto i do
        if a[j-1]>a[j] then
         begin
               x:=a[j-1];
               a[j-1]:=a[j];
               a[j]:=x;
         end;
 end.   



W3C

[Zpět] [Změna kódování] [Stromeček]
Zpět kódování stromeček