190 likes | 325 Views
Metody řazení polí. Pokusím se Vám vysvětlit princip řazení polí pomocí metod: SelectSort, InsertSort, BubleSort a potom Vám pomůžu s vytvořením vlastního kódu. Začneme metodou SelectSort a ukážeme si ji prakticky např. na číslech (pro svou jednoduchost) Ale řadit můžeme téměř vše
E N D
Metody řazení polí Pokusím se Vám vysvětlit princip řazení polí pomocí metod: SelectSort, InsertSort, BubleSorta potom Vám pomůžu s vytvořením vlastního kódu...
Začneme metodou SelectSort a ukážeme si ji prakticky např. na číslech (pro svou jednoduchost) Ale řadit můžeme téměř vše (text, objekty, a to podle různých parametrů). Mějme např. tyto čísla: 2, 6, 9, 1, 7, 4. a nyní začneme procházet naše pole od první pozice a najdeme nejmenší číslo to je č. 1 a to dáme na začátek tím způsobem že je vyměníme. Naše pole teď vypadá takto: 1, 6, 9, 2, 7, 4. Nyní začneme prohledávat pole až od druhé pozice a opět hledáme nejmenší číslo, to je č. 2 a opět ho vyměníme.
Pole vypadá takto: 1, 2, 9, 6, 7, 4. Opět začneme prohledávat pole o jednu pozici dál tzn. od třetí dalším nejmenším číslem je č. 4. Po výměně pole vypadá následovně 1, 2, 4, 6, 7, 9. Na čtvrté pozici je č. 6 a to je číslo pro nás nejmenší, proto k výměně nedojde a pokračujeme dále… Naše pole je již seřazené... teď si to vyzkoušíme přímo ve VB...
Jak jste si určitě dobře všimli budeme potřebovat prvky mezi sebou vyměňovat proto si nejprve vytvoříme podprogram na výměnu prvků... Sub Vymena (x, y) z = x x = y y = z End Sub
Sub SelectSort () Nejprve potřebujeme pole, to se definuje pomocí příkazu Array Pole = Array (2, 6, 9, 1, 7, 4) nyní potřebujeme cyklus, který nám bude procházet prvky v poli For i = LBound (Pole) To UBound (Pole) ' cykluj i od dolní meze pole až po horní mez v našem případě je to od 0 do 5 nebo od 1 do 6 v případě, že máme nastavený Option Base 1 nyní položíme první prvek jako Minimum Minimum = i ' Tím se minimem stane vždy první prvek procházené části
Pro porovnávání potřebujeme zavést druhý cyklus který bude cyklovat vždy o index výše. For j = i + 1 To UBound (Pole) Porovnání pak vypadá takto: If Pole (j) < Pole (Minimum) Then ' Jestliže je Pole s indexem j větší než pole s indexem minimum pak proveď tyto příkazy: Minimum = i ' Nové minimum Call Vymena (Pele (j), Pole (Minimum)) ' Zavolej podprogram Vymena a vyměň prvky v poli Teď zbývá ukončit rozhodování a oba cykly: End If Next j Next i
Celý kód pak vypadá takto: Sub SelectSort() Pole = Array (2, 6, 9, 1, 7, 4) For i = LBound (Pole) To UBound (Pole) Minimum = i For j = i + 1 To UBound (Pole) If Pole (j) < Pole (Minimum) Then Minimum = i Call Vymena (Pole (j), Pole (Minimum)) End If Next j Next i End Sub Zkusme si ho odladit (nejlépe přímo v ladícím okně programu VB)
Další metodou je metoda InsertSort, která pracuje na principu zakládání prvků... Mějme např. tyto čísla: 2, 6, 9, 1, 7, 4. Vezmeme první číslo, tj. 2 a vložíme ho na začátek prázdné řady. Pak vezmeme druhé číslo tj. 6 a vložíme ho na konec, teď se ptáme, jestli je menší než to před ním. Naše není menší tak ho necháme tam naše řada vypadá zatím takto: 2, 6. Vezmeme další, to opět vložíme na konec a ptáme se, jestli je menší než to předním 9 není větší jak 6 a tak ji necháme na konci 2, 6, 9.
2, 6, 9, 1, 7, 4. Dalším číslem v pořadí je č. 1 opět ho vložíme na konec a testujeme zda je menší než čísla před ním… 1 je menší jak 9 tak se prohodí 2, 6, 9, 1 1 je menší jak 6 tak se opět prohodí 2, 6, 1, 9 a jelikož je menší než 2 tak se opět prohodí 2, 1, 6, 9 opět vložíme 7 na konec a zjistíme že je menší jak číslo před ní tj. 9 opět je prohodíme. 1, 2, 6, 9, 7 => 1, 2, 6, 7, 9 Ale 7 už není menší jak 6 tak už zůstane tam. Pole vypadá takto: 1, 2, 6, 7, 9 Posledním číslem je číslo 4 a to opět vložíme na konec a postupním testováním se nám zařadí až mezi 2 a 6. A pole máme seřazené 1, 2, 4, 6, 7, 9
teď si to vyzkoušíme přímo ve VB... opět je tam samé vyměňování a tak použijeme podprogram Vymena z prvního příkladu… Jelikož budeme testovat jestli už je prvek na správném místě zavedeme si logickou proměnnou typu Boolean Sub InsertSort (Pole, Prvky) Dim Nalezeno As Boolean Nyní potřebujeme cyklus dlouhý počet prvků, které budeme vkládat For i = 0 To UBound (Prvky)
Jelikož se naše pole bude rozšiřovat budeme potřebovat ReDimenzaci ReDim Preserve Pole (LBound (Pole) To UBound (Pole) + 1) Nyní vložíme prvek na konec pole, nastavíme proměnou Nalezeno na False a proměnnou j pro další cyklus na horní mez našeho nového pole: Pole (UBound (Pole)) = Prvek (i) Nalezeno = False j = UBound (Pole) Nyní vytvoříme podmíněný cyklus: Do While j >= 1 And Not Nalezeno ' Cykluj tak dlouho, dokud j je menší nebo rovno 1 a zároveň ještě není Nalezeno.
If Prvek (i) < Pole (j - 1) Then ' Jestliže je vkládaný prvek menší než ten před ním proveď tyto příkazy: Call Vymena (Pole (j), Pole (j -1)) ' Zavolej podprogram pro výměnu j = j -1 ' Zmenši hodnotu proměnné j o 1 pro případ, že ještě není prvek na správném místě Else V případě, že je na správném místě, tj. že už není menší než ten před ním nastav proměnnou Nalezeno na hodnotu True Nalezeno = True Teď už zbývá jen ukončit rozhodování a cykly: End If Loop Next i End Sub
Celý kód pak vypadá takto: Sub InsertSort (Pole, Prvky) Dim Nalezeno As Boolean For i = 0 To UBound (Prvky) ReDim Preserve Pole (LBound (Pole) To UBound (Pole) + 1) Pole (UBound (Pole)) = Prvky (i) Nalezeno = False j = UBound (Pole) Do While j >= 1 And Not Nalezeno If Prvky (i) < Pole (j - 1) Then Call Vymena (Pole (j), Pole (j -1)) j = j -1 Else Nalezeno = True End If Loop Next i End Sub
A poslední metodou je metoda BubleSort, která pracuje na principu tzv. „vybublávání“ prvků… Mějme např. tyto čísla: 2, 6, 9, 1, 7, 4. A začneme postupně od zadu porovnávat, která čísla jsou menší… Je 4 menší jak 7? Ano. Vyměníme je 2, 6, 9, 1, 7, 4. Je 4 menší jak 1? Ne. Tak nic 2, 6, 9, 1, 4, 7. Je 1 menší jak 9? Ano. Vyměníme je 2, 6, 9, 1, 4, 7. Je 1 menší jak 6? Ano. Vyměníme je 2, 6, 1, 9, 4, 7. Je 1 menší než 2? Ano. Vyměníme je 2, 1, 6, 9, 4, 7. Pole zatím vypadá takto: 1, 2, 6, 9, 4, 7.
1, 2, 6, 9, 4, 7. A začneme zase od konce Je 7 menší jak 4? Ne. Nic se neděje 1, 2, 6, 9, 4, 7. Je 4 menší než 9? Ano. Vyměníme je 1, 2, 6, 9, 4, 7. Je 4 menší než 6? Ano. Vyměníme je 1, 2, 6, 4, 9, 7. Je 4 menší něž 2 a 2 menší než 1? Ne. 1, 2, 4, 6, 9, 7. A zase od konce… Je 7 menší než 9? Ano. Vyměníme je 1, 2, 4, 6, 9, 7. 1, 2, 4, 6, 7, 9. A testujeme tak dlouho, do až projedeme všechny možnosti… Ve VB to pak bude vypadat asi takto….
Sub BubleSort (Pole) Zavedeme si dva cykly, jeden na počet testování od zadu, a druhý na samotný test. For i = 1 To UBound (Pole) For j = UBound (Pole) To i Step – 1 ‘cyklus od konce Nyní potřebujeme rozhodování a výměnu If Pole (j) < Pole (j –1) Then Call Vymena (Pole (j), Pole (j –1)) A nakonec ukončíme cykly Next j Next i End Sub
Celý program pak vypadá takto: Sub BubleSort (Pole) For i = 1 To UBound (Pole) For j = UBound (Pole) To i Step – 1 If Pole (j) < Pole (j –1) Then Call Vymena (Pole (j), Pole (j –1)) End If next j Next i End Sub
Na závěr jen několik málo rad: Používejte Option Explicit a dimenzujte proměnné ušetří Vám to spoustu času při hledání drobných chyb, způsobených překlepy. Není na škodu odladit si program pomocí Watch Window zjistíte co přesně Váš program dělá… Každý program se dá udělat různými způsoby, zkuste nalézt co nejjednodušší řešení… Ukládejte si své projekty průběžně, ať nepláčete nad zbytečně stráveným časem při nečekaném výpadku sítě či zahryznutí PC. A nakonec přeji mnoho úspěchů při Vaší programátorské činnosti
Konec Při jakýchkoliv dotazech a připomínkách se na mě můžete obrátit buď osobně: Kateřina Bambušková, 4.D-E, SPŠ Bruntál nebo můžete psát na emailovou adresu: katerina.bambuskova@seznam.cz