Triedenie vkladaním: Rozdiel medzi revíziami
(Vytvorená stránka „Kategória:Študijné materiály Kategória:Programovanie Kategória:Informatika {{Draft}} {{Skripta programovanie}} __TOC__ ==Insert sort== ==Shell sort==“) |
|||
Riadok 8: | Riadok 8: | ||
==Insert sort== | ==Insert sort== | ||
+ | Insert Sort nepatrí medzi výhodné algoritmy triedenia, nakoľko pracuje s operačnou zložitosťou O(n^2). Výsledkom jeho triedenia je stabilné pole (čiže zachová relatívne usporiadanie duplicitných kľúčov triedených prvkov). Insert Sort sa vyznačuje taktiež jednoduchou realizáciou a vhodný je hlavne na takmer usporiadané pole s malým počtom prvkov(pod 2 000). Pri usporadúvaní už usporiadaného poľa je Insert Sort dokonca rýchlejší ako Quicksort, pretože každý nový prvok porovnáva len s posledným v danom poli. | ||
+ | ===Princíp algorimtu=== | ||
+ | Princíp algoritmu Instert sort sa dá ľahko vysvetliť na princípe zotriedenia hráčskych kariet. Keď dostane hráč karty, snaží sa ich usporiadať podľa ich hodnoty jednoducho tak, že zoberie prvú kartu, ktorá netvorí žiadanú postupnosť a vloží ju na správne miesto. Samotný algoritmus, kde usporiadavame pole celých čísel od najmenšieho po najväčšie môžeme definovať ako: | ||
+ | #rozdeľ triedené pole na zotriedenú a nezotriedenú časť. Na začiatku bude zotriedená časť prázdna a nezotriedená časť bude obsahovať všetky prvky. Začíname s prvkom na indexe i=0. | ||
+ | #Zober prvok na indexe i z nezotriedenej časti a vlož ho na správne miesto v zotriedenej časti nasledovne: | ||
+ | ##Prvok, pre ktorý hľadáme správne umiestnenie si označme x. Index posledného prvku v zotriedenej časti označme ''j''. | ||
+ | ##Porovnaj prvok x, s prvkom z zotriedenej časti (pole[j]). | ||
+ | ##Ak je x < pole[j] , posuň tento prvok o jednu pozíciu doprava. Zmenši hodnotu j o 1 (posuň sa o jednu pozíciu doľava). Choď na krok 2.2 | ||
+ | ##Ak je x > pole[j] , tak na pozíciu j vlož prvok x. | ||
+ | ##Opakuj algoritmus od začiatku (krok 2) s ďalším prvkom v nezotriedenej čast (i=i+1) | ||
+ | ===Vzorový príklad=== | ||
+ | Majme nezotriedené pole celých čísel (tabuľka 1, riadok č. 1). Jednotlivé riadky tabuľky reprezentujú iterácie triedenia. Čísla hrubo vytlačené znamenajú pozíciu prvku s ktorým v ďalšom kroku porovnávame susedný (ľavý) prvok. Červené písmo znamená aktuálnu zámenu dvoch prvkov. Zelené pozadie majú už usporiadané prvky, ktoré už nemusíme kontrolovať, či sú na správnej pozícii. | ||
+ | |||
+ | {| border="1" cellpadding="3" cellspacing="0" class=wikitable | ||
+ | |+ Tabuľka 1 - Bubble sort | ||
+ | |- | ||
+ | !iterácia | ||
+ | !p[0] | ||
+ | !p[1] | ||
+ | !p[2] | ||
+ | !p[3] | ||
+ | !p[4] | ||
+ | !p[5] | ||
+ | !operácia | ||
+ | |- | ||
+ | |1.||'''5'''||3||1||2||7||4||. | ||
+ | |- | ||
+ | |2.||style="background-color:lightgreen"|5||'''3'''||1||2||7||4||. | ||
+ | |- | ||
+ | |3.||style="background-color:lightgreen;color:red"|3||style="background-color:lightgreen;color:red"|5||'''1'''||2||7||4||. | ||
+ | |- | ||
+ | |4.||style="background-color:lightgreen"|3||style="background-color:lightgreen;color:red"|'''1'''||style="color:red"|5||2||7||4||. | ||
+ | |- | ||
+ | |5.||style="background-color:lightgreen;color:red"|'''1'''||style="background-color:lightgreen;color:red"|3||style="background-color:lightgreen"|5||'''2'''||7||4||. | ||
+ | |- | ||
+ | |6.||style="background-color:lightgreen"|1||style="background-color:lightgreen"|3||style="background-color:lightgreen;color:red"|'''2'''||style=";color:red"|5||7||4||. | ||
+ | |- | ||
+ | |7.||style="background-color:lightgreen"|1||style="background-color:lightgreen;color:red"|'''2'''||style="background-color:lightgreen;color:red"|3||5||7||4||. | ||
+ | |- | ||
+ | |8.||style="background-color:lightgreen"|1||style="background-color:lightgreen"|2||style="background-color:lightgreen"|3||style="background-color:lightgreen"|5||'''7'''||4||. | ||
+ | |- | ||
+ | |9.||style="background-color:lightgreen"|1||style="background-color:lightgreen"|2||style="background-color:lightgreen"|3||style="background-color:lightgreen"|5||style="background-color:lightgreen"|7||'''4'''||. | ||
+ | |- | ||
+ | |10.||style="background-color:lightgreen"|1||style="background-color:lightgreen"|2||style="background-color:lightgreen"|3||style="background-color:lightgreen"|5||style="background-color:lightgreen;color:red"|'''4'''||style="color:red"|7||. | ||
+ | |- | ||
+ | |11.||style="background-color:lightgreen"|1||style="background-color:lightgreen"|2||style="background-color:lightgreen"|3||style="background-color:lightgreen;color:red"|'''4'''||style="background-color:lightgreen;color:red"|5||7||. | ||
+ | |- | ||
+ | |12.||style="background-color:lightgreen"|1||style="background-color:lightgreen"|2||style="background-color:lightgreen"|3||style="background-color:lightgreen"|4||style="background-color:lightgreen"|5||style="background-color:lightgreen"|7||. | ||
+ | |} | ||
+ | ===Implementácia algoritmu=== | ||
+ | ====Insert Sort v pseudokóde <ref>Insertion sort - http://en.wikipedia.org/wiki/Insertion_sort</ref>==== | ||
+ | <source lang="delphi" line> | ||
+ | insertionSort(array A) | ||
+ | begin | ||
+ | for i := 1 to length[A]-1 do | ||
+ | begin | ||
+ | value := A[i]; | ||
+ | j := i - 1; | ||
+ | done := false; | ||
+ | repeat | ||
+ | if A[j] > value then | ||
+ | begin | ||
+ | A[j + 1] := A[j]; | ||
+ | j := j - 1; | ||
+ | if j < 0 then | ||
+ | done := true; | ||
+ | end | ||
+ | else | ||
+ | done := true; | ||
+ | until done; | ||
+ | A[j + 1] := value; | ||
+ | end; | ||
+ | end; | ||
+ | </source> | ||
+ | ====Insert Sort v C==== | ||
+ | <source lang="c" line> | ||
+ | void InsertSort(int pole[ ], int pocet) | ||
+ | { int i,j,tmp; | ||
+ | for(i=1; i<pocet; i++) // cez pole prejdeme pocet krat | ||
+ | { j=i; // 0..i-1 su uz zotriedene | ||
+ | tmp=pole[j]; // tento prvok budeme zoradovat | ||
+ | while( (j>0) && (pole[j-1] > tmp) ) // hladame, kde | ||
+ | { pole[j]=pole[j-1]; // prvok vlozime | ||
+ | j--; | ||
+ | } | ||
+ | pole[j]=tmp; // vlozime prvok na spravne miesto | ||
+ | } | ||
+ | } | ||
+ | </source> | ||
==Shell sort== | ==Shell sort== | ||
+ | ===Princíp algorimtu=== | ||
+ | ===Implementácia algoritmu=== | ||
+ | |||
+ | =Zdroje a odkazy= | ||
+ | <references/> |
Verzia zo dňa a času 23:09, 5. marec 2010
Obsah
Insert sort
Insert Sort nepatrí medzi výhodné algoritmy triedenia, nakoľko pracuje s operačnou zložitosťou O(n^2). Výsledkom jeho triedenia je stabilné pole (čiže zachová relatívne usporiadanie duplicitných kľúčov triedených prvkov). Insert Sort sa vyznačuje taktiež jednoduchou realizáciou a vhodný je hlavne na takmer usporiadané pole s malým počtom prvkov(pod 2 000). Pri usporadúvaní už usporiadaného poľa je Insert Sort dokonca rýchlejší ako Quicksort, pretože každý nový prvok porovnáva len s posledným v danom poli.
Princíp algorimtu
Princíp algoritmu Instert sort sa dá ľahko vysvetliť na princípe zotriedenia hráčskych kariet. Keď dostane hráč karty, snaží sa ich usporiadať podľa ich hodnoty jednoducho tak, že zoberie prvú kartu, ktorá netvorí žiadanú postupnosť a vloží ju na správne miesto. Samotný algoritmus, kde usporiadavame pole celých čísel od najmenšieho po najväčšie môžeme definovať ako:
- rozdeľ triedené pole na zotriedenú a nezotriedenú časť. Na začiatku bude zotriedená časť prázdna a nezotriedená časť bude obsahovať všetky prvky. Začíname s prvkom na indexe i=0.
- Zober prvok na indexe i z nezotriedenej časti a vlož ho na správne miesto v zotriedenej časti nasledovne:
- Prvok, pre ktorý hľadáme správne umiestnenie si označme x. Index posledného prvku v zotriedenej časti označme j.
- Porovnaj prvok x, s prvkom z zotriedenej časti (pole[j]).
- Ak je x < pole[j] , posuň tento prvok o jednu pozíciu doprava. Zmenši hodnotu j o 1 (posuň sa o jednu pozíciu doľava). Choď na krok 2.2
- Ak je x > pole[j] , tak na pozíciu j vlož prvok x.
- Opakuj algoritmus od začiatku (krok 2) s ďalším prvkom v nezotriedenej čast (i=i+1)
Vzorový príklad
Majme nezotriedené pole celých čísel (tabuľka 1, riadok č. 1). Jednotlivé riadky tabuľky reprezentujú iterácie triedenia. Čísla hrubo vytlačené znamenajú pozíciu prvku s ktorým v ďalšom kroku porovnávame susedný (ľavý) prvok. Červené písmo znamená aktuálnu zámenu dvoch prvkov. Zelené pozadie majú už usporiadané prvky, ktoré už nemusíme kontrolovať, či sú na správnej pozícii.
iterácia | p[0] | p[1] | p[2] | p[3] | p[4] | p[5] | operácia |
---|---|---|---|---|---|---|---|
1. | 5 | 3 | 1 | 2 | 7 | 4 | . |
2. | 5 | 3 | 1 | 2 | 7 | 4 | . |
3. | 3 | 5 | 1 | 2 | 7 | 4 | . |
4. | 3 | 1 | 5 | 2 | 7 | 4 | . |
5. | 1 | 3 | 5 | 2 | 7 | 4 | . |
6. | 1 | 3 | 2 | 5 | 7 | 4 | . |
7. | 1 | 2 | 3 | 5 | 7 | 4 | . |
8. | 1 | 2 | 3 | 5 | 7 | 4 | . |
9. | 1 | 2 | 3 | 5 | 7 | 4 | . |
10. | 1 | 2 | 3 | 5 | 4 | 7 | . |
11. | 1 | 2 | 3 | 4 | 5 | 7 | . |
12. | 1 | 2 | 3 | 4 | 5 | 7 | . |
Implementácia algoritmu
Insert Sort v pseudokóde [1]
1 insertionSort(array A)
2 begin
3 for i := 1 to length[A]-1 do
4 begin
5 value := A[i];
6 j := i - 1;
7 done := false;
8 repeat
9 if A[j] > value then
10 begin
11 A[j + 1] := A[j];
12 j := j - 1;
13 if j < 0 then
14 done := true;
15 end
16 else
17 done := true;
18 until done;
19 A[j + 1] := value;
20 end;
21 end;
Insert Sort v C
1 void InsertSort(int pole[ ], int pocet)
2 { int i,j,tmp;
3 for(i=1; i<pocet; i++) // cez pole prejdeme pocet krat
4 { j=i; // 0..i-1 su uz zotriedene
5 tmp=pole[j]; // tento prvok budeme zoradovat
6 while( (j>0) && (pole[j-1] > tmp) ) // hladame, kde
7 { pole[j]=pole[j-1]; // prvok vlozime
8 j--;
9 }
10 pole[j]=tmp; // vlozime prvok na spravne miesto
11 }
12 }
Shell sort
Princíp algorimtu
Implementácia algoritmu
Zdroje a odkazy
- ↑ Insertion sort - http://en.wikipedia.org/wiki/Insertion_sort