Algoritmizace řazení Bubble Sort

Podobné dokumenty
Sada 1 - Základy programování

Náplň. v Jednoduché příklady na práci s poli v C - Vlastnosti třídění - Způsoby (algoritmy) třídění

Algoritmizace prostorových úloh

Pole a kolekce. v C#, Javě a C++

IAJCE Přednáška č. 9. int[] pole = new int[pocet] int max = pole[0]; int id; for(int i =1; i< pole.length; i++) { // nikoli 0 if (Pole[i] > max) {

Inovace a zkvalitnění výuky prostřednictvím ICT Základy programování a algoritmizace úloh Třídění dat. Ing. Hodál Jaroslav, Ph.D. VY_32_INOVACE_26 04

přirozený algoritmus seřadí prvky 1,3,2,8,9,7 a prvky 4,5,6 nechává Metody řazení se dělí:

DobSort. Úvod do programování. DobSort Implementace 1/3. DobSort Implementace 2/3. DobSort - Příklad. DobSort Implementace 3/3

Obecná informatika. Matematicko-fyzikální fakulta Univerzity Karlovy v Praze. Podzim 2012

Základy řazení. Karel Richta a kol.

Algoritmizace a programování

NPRG030 Programování I, 2018/19 1 / :03:07

ALG 09. Radix sort (přihrádkové řazení) Counting sort. Přehled asymptotických rychlostí jednotlivých řazení. Ilustrační experiment řazení

Třídění a vyhledávání Searching and sorting

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Universita Pardubice Fakulta elektrotechniky a informatiky. Mikroprocesorová technika. Semestrální práce

A4B33ALG 2010/05 ALG 07. Selection sort (Select sort) Insertion sort (Insert sort) Bubble sort deprecated. Quicksort.

Třídící algoritmy. Insert Sort. Bubble Sort. Select Sort. Shell Sort. Quick Sort. Merge Sort. Heap Sort.

3 Algoritmy řazení. prvku a 1 je rovněž seřazená.

Maturitní otázky z předmětu PROGRAMOVÁNÍ

Dynamické datové struktury III.

Časová složitost algoritmů

Test prvočíselnosti. Úkol: otestovat dané číslo N, zda je prvočíslem

5. Vyhledávání a řazení 1

IB111 Úvod do programování skrze Python

Programování v C++, 2. cvičení

Prioritní fronta, halda

Maturitní téma: Programovací jazyk JAVA

V případě jazyka Java bychom abstraktní datový typ Time reprezentující čas mohli definovat pomocí třídy takto:

Algoritmy I, složitost

6 Příkazy řízení toku

ˇ razen ı rychlejˇ s ı neˇ z kvadratick e Karel Hor ak, Petr Ryˇsav y 20. dubna 2016 Katedra poˇ c ıtaˇ c u, FEL, ˇ CVUT

Zadání k 2. programovacímu testu

Rekurze a rychlé třídění

Datové struktury. alg12 1

Bubble sort. příklad. Shaker sort

Úvod do programování - Java. Cvičení č.4

IB111 Úvod do programování skrze Python

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

Algoritmizace a programování

ADT/ADS = abstraktní datové typy / struktury

Časová složitost algoritmů, řazení a vyhledávání

Základy algoritmizace a programování

1. Implementace funkce počet vrcholů. Předmět: Algoritmizace praktické aplikace (3ALGA)

Algoritmy I. Třídění ALGI 2010/2011

ALGORITMY A DATOVÉ STRUKTURY

Řazení. Uspořádat množinu prvků obsahujících klíč podle definovaného kriteria.

Digitální učební materiál

Paměť počítače. alg2 1

Obsah přednášky. Příkaz for neúplný. Příkaz for příklady. Cyklus for each (enhanced for loop) Příkaz for příklady

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false

Select sort: krok 1: krok 2: krok 3: atd. celkem porovnání. výběr nejmenšího klíče z n prvků vyžaduje 1 porovnání

Složitost UPR 2008/09 1

Digitální učební materiál

2. lekce Algoritmus, cyklus Miroslav Jílek

Algoritmy vyhledávání a řazení. Zatím nad lineární datovou strukturou (polem)

Asymptotická složitost algoritmů

Dynamické datové struktury IV.

8 Třídy, objekty, metody, předávání argumentů metod

VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ BRNO UNIVERSITY OF TECHNOLOGY

ALG 14. Vícedimenzionální data. Řazení vícedimenzionálních dat. Experimentální porovnání řadících algoritmů na vícedimenzionálních datech

Lineární spojový seznam (úvod do dynamických datových struktur)

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

Digitální učební materiál

Úvod do programovacích jazyků (Java)

Algoritmy a datové struktury

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

boolean hasnext() Object next() void remove() Kolekce

Základní informace o předmětu Otázka:

Pointery II. Jan Hnilica Počítačové modelování 17

Základy programování (IZP)

Příklad : String txt1 = new String( Ahoj vsichni! ); //vytvoří instanci třídy String a přiřadí ji vnitřní hodnotu Ahoj vsichni!

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Šablony, kontejnery a iterátory

Pole a Funkce. Úvod do programování 1 Tomáš Kühr

Šablony, kontejnery a iterátory

6. Příkazy a řídící struktury v Javě

Datový typ prioritní fronta Semestrální práce z předmětu 36PT

Lekce 04 Řídící struktury

Časová a prostorová složitost algoritmů

Paralelní programování

IB111 Základy programování Radek Pelánek 1 / 61

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.

IB111 Úvod do programování 1 / 62

zapište obslužnou metodu události Click tlačítka a vyzkoušejte chování polevýsledek.text = polečíslo1.text + polečíslo2.text;

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

int t1, t2, t3, t4, t5, t6, t7, prumer; t1=sys.readint();... t7=sys.readint(); prume pru r = r = ( 1+t 1+t t3+ t3+ t4 t5+ t5+ +t7 +t7 )/ ;

Kolekce, cyklus foreach

Úvod do programování 6. hodina

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

KTE / ZPE Informační technologie

Tematický celek Proměnné. Proměnné slouží k dočasnému uchovávání hodnot během provádění aplikace Deklarace proměnných

Profilová část maturitní zkoušky 2013/2014

Implementace seznamů do prostředí DELPHI pomocí lineárního seznamu

Řídicí struktury. alg3 1

vyhledávací stromové struktury

2.1 Podmínka typu case Cykly Cyklus s podmínkou na začátku Cyklus s podmínkou na konci... 5

1 PRVOCISLA: KRATKY UKAZKOVY PRIKLAD NA DEMONSTRACI BALIKU WEB 1

Vyvažování a rotace v BVS, všude se předpokládá AVL strom

Transkript:

Algoritmizace řazení Bubble Sort Cílem této kapitoly je seznámit studenta s třídícím algoritmem Bubble Sort, popíšeme zde tuto metodu a porovnáme s jinými algoritmy. Klíčové pojmy: Třídění, Bubble Sort, bublinkové třídění, algoritmus, složitost, náročnost, řazení. Úvod Jednou z nejnáročnějších úloh jsou v algoritmizaci třídící algoritmy. Jejich úkolem je seřadit podle velikosti řadu číselných nebo alfanumerických údajů. Bez třídících algoritmů se neobejde žádná úloha hromadného zpracování dat, protože vyhledávání informací v seřazených datech je podstatně jednodušší a rychlejší než v datech neseřazených. Př.: seřadíme sestupně řadu čísel 2 1 3 5 10 6 21 18 9 0 Na 0 1 2 3 5 6 9 10 18 21 Popis problému Na algoritmech nás zajímají především tyto hlediska: Složitost algoritmu znamená jak složitý program je Nároky na paměť množství paměti potřebné pro běh algoritmu Rychlost časová složitost je dána počtem operací při třídění (průchod pole a počet porovnání) Tak tedy podle předchozích odrážek bude ideální algoritmus jednoduchý, rychlý s malými nároky na paměť. Ale ideální algoritmus neexistuje, případně je známo, který algoritmus je na zvolený soubor dat nejvhodnější (už to někdo řešil a našel vhodnou metodu). Běžné univerzální algoritmy: bublinkové řazení Bubble sort řazení přetřásáním Sbake sort řazení haldou Heapsort řazení vkládáním Insertion sort řazení slučováním Merge sort rychlé řazení Quick sort řazení výběrem Selection sort shellovo řazení Shell sort 6/17/2012 Bubble Sort Stránka 1 z 6

Algoritmus Bubble Sort Bublinkové řazení (řazení záměnou) je z hlediska naprogramování nejjednodušším algoritmem pro třídění. Výhodou je rovněž, že je stabilní tzn., nemění pozici prvků, které při porovnávání vyhodnoceny jako ekvivalentní. Bublinkové třídění je jeden z mála třídících algoritmů, kterému stačí sekvenční přístup k datům (algoritmus nepotřebuje ve tříděné posloupnosti provádět žádné skoky). Pro praktické účely je neefektivní, využívá se hlavně pro výukové účely a pro řazení kratších posloupností. V minulosti se proto používal ke třídění dat na páskových médiích, dnes jej lze s výhodou použít například při třídění jednosměrně zřetězeného spojového seznamu. Metoda: Algoritmus opakovaně prochází seznam (pole), přičemž porovnává každé dva sousedící prvky. Pokud nejsou ve správném pořadí, prohodí je. Porovnávání prvků běží do té doby, dokud není seznam seřazený. Algoritmus je univerzální (pracuje na základě porovnávání dvojic prvků), pracuje lokálně (nevyžaduje pomocnou paměť), je stabilní (prvkům se stejným klíčem nemění vzájemnou polohu), patří mezi přirozené řadicí algoritmy (částečně seřazený seznam zpracuje rychleji než neseřazený). Tento algoritmus řazení je jedním z nejpomalejších, oproti jiným algoritmům se stejnou složitostí vyžaduje velké množství zápisů do paměti. Existuje více variant tohoto algoritmu. Jiné varianty mají takovou úpravu algoritmu, aby se snížil počet porovnávaných prvků (opakovaně porovnávat již hotové prvky nebo opakovaně zapisoval do paměti) a tím dosáhneme celkově i větší efektivnosti metody. Výhody nevýhody Bublinkové třídění se používá například pro výuku programování, nebo pro třídění malých polí nebo polí, která jsou již částečně setříděna. Vzhledem k vysokému výkonu současných počítačů může mít "malé" pole i několik tisíc prvků, avšak pro třídění opravdu velkých polí je "bubble sort" naprosto nevhodný. Pokud trvá setřídění např. 10 prvků dlouhého pole jednotku času, pak při bublinkovém třídění 1000 prvků spotřebujeme 1000000 jednotek času, zatímco při použití kvalitního algoritmu pouze 200 jednotek času. Vstupní data příkladu jsou totožná s daty použitými v kapitole pojednávající o MergeSort. Zadání pro programátory: Upravte program tak, abyste zjistily počet IF THEN operací při klasickém BubbleSort a při upraveném BubbleSort. 6/17/2012 Bubble Sort Stránka 2 z 6

Příklad V případě našich 10-ti prvků je potřeba v případě prvního algoritmu 10 až 100 operací. Pouze 10 operací se provede v případě, že pole je již setříděné a k žádné výměně prvků nedojde. Maximálně 100 operací (složitost = každý prvek s každým -> O = n*n=n 2 ) Zato v druhém případě je počet operací (n-1)+(n-2)+ +(2)+(1). V našem případě 9+8+7+6+5+4+3+2+1=45 operací. krok 1 2 1 3 5 10 6 21 18 9 0 2 1 2 3 5 10 6 21 18 9 0 3 1 2 3 5 10 6 21 18 9 0 4 1 2 3 5 10 6 21 18 9 0 5 1 2 3 5 10 6 21 18 9 0 6 1 2 3 5 10 6 21 18 9 0 7 1 2 3 5 10 6 21 18 9 0 8 1 2 3 5 10 6 21 18 9 0 9 1 2 3 5 10 6 21 18 9 0 10 0 2 3 5 10 6 21 18 9 1 11 0 2 3 5 10 6 21 18 9 1 12 0 2 3 5 10 6 21 18 9 1 13 0 2 3 5 10 6 21 18 9 1 14 0 2 3 5 10 6 21 18 9 1 15 0 2 3 5 10 6 21 18 9 1 16 0 2 3 5 10 6 21 18 9 1 17 0 2 3 5 10 6 21 18 9 1 18 0 1 3 5 10 6 21 18 9 2 19 0 1 3 5 10 6 21 18 9 2 20 0 1 3 5 10 6 21 18 9 2 21 0 1 3 5 10 6 21 18 9 2 22 0 1 3 5 10 6 21 18 9 2 23 0 1 3 5 10 6 21 18 9 2 24 0 1 3 5 10 6 21 18 9 2 25 0 1 2 5 10 6 21 18 9 3 26 0 1 2 5 10 6 21 18 9 3 27 0 1 2 5 10 6 21 18 9 3 28 0 1 2 5 10 6 21 18 9 3 29 0 1 2 5 10 6 21 18 9 3 30 0 1 2 5 10 6 21 18 9 3 31 0 1 2 3 10 6 21 18 9 5 32 0 1 2 3 6 10 21 18 9 5 33 0 1 2 3 6 10 21 18 9 5 34 0 1 2 3 6 10 21 18 9 5 35 0 1 2 3 6 10 21 18 9 5 36 0 1 2 3 5 10 21 18 9 6 37 0 1 2 3 5 10 21 18 9 6 38 0 1 2 3 5 10 21 18 9 6 39 0 1 2 3 5 9 21 18 10 6 40 0 1 2 3 5 6 21 18 10 9 41 0 1 2 3 5 6 18 21 10 9 42 0 1 2 3 5 6 10 21 18 9 43 0 1 2 3 5 6 9 21 18 10 44 0 1 2 3 5 6 9 18 21 10 45 0 1 2 3 5 6 9 10 21 18 0 1 2 3 5 6 9 10 18 21 Popis tabulky: Jeden řádek je jedna podmínka IF THEN výměna. Zelené políčko je první prvek který testujeme(porovnáváme) a na toto políčko poté případě vložíme lepší prvek (< nebo > o všem rozhoduje právě toto jedno znaménko). Žluté, nebo růžové políčko je druhý testovaný prvek. V případě, že prvek vyměníme, je označen růžově. Taková výměna je již vidět na dalším řádku. 6/17/2012 Bubble Sort Stránka 3 z 6

Popis algoritmu V příloze se nachází výše uvedený příklad naprogramovaný v jazyce JAVA. Programovací jazyk dejme stranou, protože nám nyní jde o algoritmus a ten bude i v jiných jazycích pořád ten samý! Níže uvedený příklad najdete v BubbleSort.java Algoritmus je uveden (naprogramován) ve dvou variantách: static void bsort(int[] pole){ // klasická metoda třídění boolean serazeno; do{ serazeno = true; // předpokládáme setříděné pole // cyklus k procházení celého ( pole -1 ) for (int i =0 ; i < pole.length-1 ; i++){ if ( pole[i] > pole[i+1] ){ // test zda je potřeba buňky zaměnit int pom = pole[i]; // pomocná proměnná pom pole[i] = pole[i+1]; // postupná výměna pole[i+1] = pom; serazeno = false; // FALSE = znamená, p. není setříděno! while (! serazeno ); // podm. ukončení opakov. procházení p. Varianta první je klasická. Máme proměnnou seřazeno která nabývá dvou stavů TRUE/FALSE. V případě FALSE se opakuje cyklus FOR, který projde pole a dojde k setřídění dvou sousedních prvků pole. Cyklus prochází od prvního prvku pole (seznamu) až k předposlednímu (předposlední se kontroluje s posledním!). pokud projde pole celé a nedojde k výměně, cyklus DO While se ukončí (reřazeno = TRUE). Znamená to, že algoritmus projde pole, u každého prvku zjistí, zda ho vymění (případně vymění). Při tomto jednom průchodu probublá jedna hodnota (největší nebo nejmenší) na konec pole. V případě že nastala nějaká výměna je spuštěn nový průchod polem (to znamená, že pole ještě nemusí být setříděno!). Až projde celé pole a nenastane výměna, tak proměnná seřazeno nabyde takového stavu, aby smyčka DO - WHILE byla ukončena. Poznámka: Tento algoritmus opakovaně kontroluje již správně setříděné prvky. Pokud jste šikovní můžete souboru BubbleSort.java použít ve svých programech (statická metoda bsort(int[]) ). 6/17/2012 Bubble Sort Stránka 4 z 6

Další varianta: static void bsort2(int[] pole){ // upravená metoda třídění // první cyklus - první porovnávaná buňka for (int i =0 ; i < pole.length-1 ; i++){ for (int j = i+1 ; j < pole.length ; j++){ // vnořený cyklus if ( pole[i] > pole[j] ){ // test zda je potřeba buňky zaměnit int pom = pole[i]; // pomocná proměnná pom pole[i] = pole[j]; // postupná výměna pole[j] = pom; Druhá metoda je modifikací, za účelem dosažení vyšší efektivnosti. Je zde také dvojitý cyklus FOR FOR, ale tak že první běží od posledních zkontrolovaného do předposledního prvku a vnořená FOR běží od kontrolovaného prvku až do konce pole (seznamu). Možná to není na první pohled jasné, ale druhý postup je efektivnější v tom, že neprochází při každém cyklu celé pole, ale pouze ještě nesetříděný zbytek pole (hledaný prvek nám probublá doleva, tam kam ukazuje první FOR cyklus). Tím předejdeme zbytečnému kontrolování již setříděných prvků. Zadání: Upravte první algoritmus tak, aby byl také efektivnější. Něco pro pokročilé Třídění jde i jednodušeji a to pomocí balíků již v Javě obsažených. Protože toto není náplní tohoto textu, tak pouze útržkovitě. Máte zde příklad na volání metody setřídění a metody pro převod na text. Př.: V programu udělujete změnu a užijte Arrays. import java.util.arrays; // balík Arrays Arrays.sort(pole); // užití metody Sort() String s = Arrays.toString(pole); // alternativa tisku pole Systém.out.println(s); 6/17/2012 Bubble Sort Stránka 5 z 6

Něco pro začátečníky Pokud jste začátečníci, nebo programátorští emigranti z jiných jazyků, může se Vám zdát divné, že metody nemají návratovou hodnou. To je v pořádku! Máme totiž 2 typy volání a to hodnotou nebo odkazem. Volání hodnotou je v případě primitivních datových typů. A právě zde je ten druhý případ a to volání odkazem (pole není primitivní datový typ, i když se z nich skládá). Závěr Bubble Sort patří mezi pomalejší algoritmy, zato je velmi jednoduchý a stabilní. Je paměťově nenáročný a vhodný spíše pro menší objemy dat. Má velkou nevýhodu a to, že časová náročnost se může velmi lišit. Pokud třídí již setříděné pole je ihned hotov, ale v případě setříděného pole, které chceme setřídit opačným směrem je počet provedených operací velký (testujeme a vyměňujeme každý prvek s každým) a tím i časová náročnost. Tento algoritmus se přesto používá a to zejména na výukové účely. Literatura: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/arrays.html; 14.6.2012 http://www.algoritmy.net/article/3/bubble-sort; 14.6.2012 http://cs.wikipedia.org/wiki/bubble_sort; 14.6.2012 6/17/2012 Bubble Sort Stránka 6 z 6