Bubble sort. příklad. Shaker sort

Podobné dokumenty
Základy řazení. Karel Richta a kol.

Sada 1 - Základy programování

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

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

Hledání k-tého nejmenšího prvku

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

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

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

Rekurze a rychlé třídě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 řazení Bubble Sort

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

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

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) {

IB111 Úvod do programování skrze Python

Algoritmizace prostorových úloh

Dynamické datové struktury III.

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

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

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

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Typický prvek kolekce pro české řazení

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

Univerzita Pardubice

Stromy. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta a kol.

IB111 Úvod do programování skrze Python

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

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

5 Rekurze a zásobník. Rekurzivní volání metody

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

Digitální učební materiál

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

Úvod do programovacích jazyků (Java)

Základy algoritmizace a programování

Stromy. Příklady. Rekurzivní datové struktury. Základní pojmy

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

Rekurzivní algoritmy

Techniky návrhu algoritmů

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

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Pokročilé řazení. Karel Richta a kol. Přednášky byly připraveny s pomocí materiálů, které vyrobili Marko Berezovský a Michal Píše

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

Algoritmická matematika

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

Datové struktury. alg12 1

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Algoritmizace a programování

Binární halda (= binary heap)

Abstraktní datové typy FRONTA

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

DSA, První krok: máme dokázat, že pro left = right vrátí volání f(array, elem, left, right)

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

C++ Akademie SH. 2. Prom nné, podmínky, cykly, funkce, rekurze, operátory. Michal Kvasni ka. 20. b ezna Za áte níci C++

Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský1/39

Stromy, haldy, prioritní fronty

Volné stromy. Úvod do programování. Kořenové stromy a seřazené stromy. Volné stromy

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

1. Téma 12 - Textové soubory a výjimky

Časová složitost algoritmů

Robert Haken [MVP ASP.NET/IIS, MCT] software architect, HAVIT, Základní algoritmy v praxi

ˇ 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

TGH07 - Chytré stromové datové struktury

2013 Martin Kačer. BI-EP2 Efektivní programování 2

Příkaz while. while (podmínka) { příkaz; } Příklad: int i=0; while (i < 10) { System.out.println(i); i++; } // vypíše čísla od 0 do 9

Digitální učební materiál

Základní datové struktury III: Stromy, haldy

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

ÚVODNÍ ZNALOSTI. datové struktury. správnost programů. analýza algoritmů

IB108 Sada 1, Příklad 1 Vypracovali: Tomáš Krajča (255676), Martin Milata (256615)

Zadání k 2. programovacímu testu

TGH07 - Chytré stromové datové struktury

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

IB111 Úvod do programování 1 / 62

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

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

Třídy a objekty -příklady

Prioritní fronta, halda (heap), řazení

Praktická cvičení algoritmů

Spojový seznam. Jan Kybic.

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

Stromy. Jan Hnilica Počítačové modelování 14

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

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

Sada úkolů pro předmět DSA

1 Úvod do Turbo Pascalu

PODOBÁ SE JAZYKU C S NĚKTERÝMI OMEZENÍMI GLOBÁLNÍ PROMĚNNÉ. NSWI162: Sémantika programů 2

TGH05 - Problém za milion dolarů.

Maturitní téma: Programovací jazyk JAVA

PG 9.5 novinky ve vývoji aplikací

Datové struktury. Obsah přednášky: Definice pojmů. Abstraktní datové typy a jejich implementace. Algoritmizace (Y36ALG), Šumperk - 12.

Úvod do programovacích jazyků (Java)

KTE / ZPE Informační technologie

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

Rozklad problému na podproblémy

Spojové struktury. Spojová struktura (linked structure):

Na začátku rozdělíme práci a určíme, které podproblémy je potřeba vyřešit. Tyto

OOPR_05. Případové studie

Dynamické datové struktury IV.

ADT Seznam. dynamická množina. prvky vkládáme a vyjímáme na libovolné pozici (místě) v jejich posloupnosti (sekvenci) zásobník a fronta vs.

Transkript:

Bubble sort pseudokód function bubblesort(array a) for i in 1 -> a.length - 1 do for j in 1 -> a.length - i - 1 do if a[j] < a[j+1] prohoď(a[j], a[j+1]); //razeni od nejvyssiho function bubblesort(int[] a){ for (i = 0; i < a.length-1; i++) { for (j = 0; j < a.length-i-1; j++) { if(a[j] < a[j+1]){ help = a[j]; a[j] = a[j+1]; a[j+1] = help; swapped = true; if(!swapped) break; příklad (3 2 8 7 6) //zadání pole, řaďme od největšího k nejmenšímu (3 2 8 7 6) // 3 a 2 jsou v korektním pořadí, posuňme se o index (3 2 8 7 6) // 8 > 2, prohoďme je (3 8 2 7 6) // 7 > 2, prohoďme je (zde je vidět probublávání nejlehčí dvojky vzhůru) (3 8 7 2 6) // 6 > 2, prohoďme je (3 8 7 6 2) // nový průchod polem: na posledním místě je nejlehčí prvek, tudíž se nám řazená úloha o jedna zkrátila, 8 > 3, prohoďme je (8 3 7 6 2) // 7 > 3, prohoďme je (8 7 3 6 2) // 6 > 3, prohoďme je (8 7 6 3 2) // seřazeno Shaker sort // radi od nejvyssiho public static void shakersort(int[] a) { for (int i = 0; i < a.length/2; i++) { boolean swapped = false; for (int j = i; j < a.length-i-1; j++) { if(a[j] < a[j+1]){ int help = a[j]; a[j] = a[j+1]; a[j+1] = help;

swapped = true; for (int j = a.length-2-i; j > i; j--) { if(a[j] > a[j-1]){ int help = a[j]; a[j] = a[j-1]; a[j-1] = help; swapped = true; if(!swapped) break; Shell sort public static int[] shellsort(int[] a) { int delka = a.length / 2; while (delka > 0) { //dokud mame co porovnavat for (int i = 0; i < a.length- delka; i++) { //upraveny insertion sort int j = i + delka; int help = a[j]; while (j >= delka && help > a[j - delka]) { a[j] = a[j - delka]; j -= delka; // j = j-delka; a[j] = help; if (delka == 2) { delka = 1; else { delka /= 2.2; return a; //zmena velikosti mezery //delka = delka/2.2; Insert sort pseudokód I. function insertionsort(array a) for i in 0 -> a.length - 2 do j = i + 1 help = a[j] while j > 0 AND help > a[j-1] do a[j] = a[j-1] j-- //uvolni misto hodnote

a[j] = help //vloz hodnotu pseudokód II. insertion_sort(a) for j = 2 to a.length k = a[j] i = j - 1 while i > 0 and a[i] > k a[i + 1] = a[i] i = i - 1 a[i + 1] = k public static void insertionsort(int[] a){ for(int i = 0; i < a.length - 1; i++){ int j = i + 1; int help = a[j]; while(j > 0 && help > a[j-1]){ a[j] = a[j-1]; j--; a[j] = help; příklad (3 2 8 7 6) // Zadání, prvek 3 je triviálně seřazen (3 2 8 7 6) // Vezmeme dvojku a vložíme jí na správné místo (tam už je) (3 2 8 7 6) // 8 vložíme na první místo, zbytek čísel posuneme (8 3 2 7 6) // 7 vložíme mezi 8 a 3, 3 a 2 posuneme (8 7 3 2 6) // 6 vložíme mezi 7 a 3, čísla 3 a 2 posuneme (8 7 6 3 2) // seřazeno Selection Sort pseudokód function selectionsort(array a) for i in 0 -> a.length - 2 do maxindex = i for j in (i + 1) -> (a.length - 1) do if a[j] > a[maxindex] maxindex = j prohoď(a[i], a[maxindex]) public static void selectionsort(int[] a){ for(int i = 0; i < a.length-1; i++){ int maxindex = i; for(int j = i + 1; j < a.length; j++){ if(a[j] > a[maxindex]) {

maxindex = j; int help = a[i]; a[i] = a[maxindex]; a[maxindex] = help; příklad (3 2 8 7 6) // zadání pole, řaďmě od největšího k nejmenšímu (3 2 8 7 6) // nejvyšší číslo je 8, prohoďme ho tedy s číslem 3 na indexu 0 (8 2 3 7 6) // nejvyšší číslo je 7, prohoďme ho tedy s číslem 2 na indexu 1 (8 7 3 2 6) // nejvyšší číslo je 6, prohoďme ho tedy s číslem 3 na indexu 2 (8 7 6 2 3) // nejvyšší číslo je 3, prohoďme ho tedy s číslem 2 na indexu 3 (8 7 6 3 2) // seřazeno Merge sort pseudokód - rekurze merge_sort(a, p, r) if p < r q = b(p + r=2)c merge_sort(a, p, q) merge_sort(a, q - 1, r) merge(a, q, r) - rekurze //razeni od nejvyssiho //a2 = pomocne pole stejne delky jako array //left = prvni index na ktery se smi sahnout //right = posledni index, na ktery se smi sahnout public static void mergesort(int[] a, int[] a2, int left, int right){ if(left == right) return; int middleindex = (left + right)/2; mergesort(a, a2, left, middleindex); mergesort(a, a2, middleindex + 1, right); merge(a, a2, left, right); for(int i = left; i <= right; i++){ a[i] = a2[i]; - iteritvní function merge(left,right) var list result while length(left) > 0 and length(right) > 0 if first(left) first(right) append first(left) to result

left = rest(left) else append first(right) to result right = rest(right) if length(left) > 0 append left to result if length(right) > 0 append right to result return result //slevani pro Merge sort private static void merge(int[] a, int[] a2, int left, int right) { int middleindex = (left + right)/2; int leftindex = left; int rightindex = middleindex + 1; int auxindex = left; while(leftindex <= middleindex && rightindex <= right){ if(a[leftindex] >= a[rightindex]){ a2[a2index] = a[leftindex++]; else{ a2[auxindex] = a[rightindex++]; a2index++; while(leftindex <= middleindex){ a2[a2index] = a[leftindex++]; a2index++; while(rightindex <= right){ a2[a2index] = a[rightindex++]; a2index++; Quick sort pseudokód - rekurze procedure quicksort(list values) if values.size <= 1 then return values pivot = náhodný prvek z values Rozděl seznam values do 3 seznamů seznam1 = { prvky větší než pivot seznam2 = { pivot seznam3 = { prvky menší než pivot return quicksort(seznam1) + seznam2 + quicksort(seznam3)

- rekurze //radi od nejvyssiho prvku //left index prvniho prvku, na ktery muzeme sahnout (leva mez (vcetne)) //right index prvniho prvku, na ktery nemuzeme sahnout (prava mez (bez)) public static void quicksort(int[] a, int left, int right){ if(left < right){ int boundary = left; for(int i = left + 1; i < right; i++){ if(a[i] > a[left]){ swap(a, i, ++boundary); swap(a, left, boundary); quicksort(a, left, boundary); quicksort(a, boundary+1, right); //prohodi prvky v zadanem poli //left prvek 1 //right prvek 2 private static void swap(int[] a, int left, int right){ int help = a[right]; a[right] = a[left]; a[left] = help; C - iterativní void quicksort(int array[], int left_begin, int right_begin){ int pivot = array[(left_begin + right_begin) / 2]; int left_index, right_index, pom; left_index = left_begin; right_index = right_begin; do { while (array[left_index] < pivot && left_index < right_begin) left_index++; while (array[right_index] > pivot && right_index > left_begin) right_index--; if (left_index <= right_index){ pom = array[left_index]; array[left_index] = array[right_index]; array[right_index] = pom; if (left_index < right_begin) left_index++; if (right_index > left_begin) right_index--; while (left_index < right_index); if (right_index > left_begin) quicksort(array,

left_begin, right_index); if (left_index < right_begin) quicksort(array, left_index, right_begin); Couting sort //return pole serazene od nejnizsi honoty po nejvyssi public static int[] countingsort(int[] a) { // pole do ktereho budeme radit, v pripade primitiv nema smysl // da se radit i bez nej, ale v pripade objektu by to jinak neslo int[] a2 = new int[a.length]; // najdeme maximum a minimum int min = a[0]; int max = a[0]; for(int i = 1; i < a.length; i++) { if(a[i] < min) min = a[i]; else if(a[i] > max) max = a[i]; // vytvorime pole do ktereho budeme pocitat int[] counts = new int[max - min + 1]; // zinicializujeme pocty vyskytu for(int i = 0; i < a.length; i++) { counts[a[i] - min]++; // prepocitame vyskyty na posledni index dane hodnoty counts[0]--; for(int i = 1; i < counts.length; i++) { counts[i] = counts[i] + counts[i-1]; // Serad pole zprava doleva // 1) vyhledej posledni vyskyt dane hodnoty v poli vyskutu // 2) uloz hodnotu na prislusne misto v serazenem poli // 3) sniz index posledniho vyskytu dane hodnoty // 4) pokracuj s predchozi hodnotou vstupniho pole (goto: 1), terminuj, pokud jiz vsechny hodnoty byly zarazeny for(int i = a.length - 1; i >= 0; i--) { a2[counts[a[i] - min]--] = a[i]; return a2;

příklady Vstupní pole: 9 6 6 3 2 0 4 2 9 3 Pole četností: 1 0 2 2 1 0 2 0 0 2 Pole výskytů: 0 0 2 4 5 5 7 7 7 9 Seřazené pole: 0 2 2 3 3 4 6 6 9 9 Vstupní pole: 2 8 9 8 0 8 8 9 4 6 Pole četností: 1 0 1 0 1 0 1 0 4 2 Pole výskytů: 0 0 1 1 2 2 3 3 7 9 Seřazené pole: 0 2 4 6 8 8 8 8 9 9 Vstupní pole: 9 2 1 9 4 1 5 7 5 3 Pole četností: 2 1 1 1 2 0 1 0 2 Pole výskytů: 1 2 3 4 6 6 7 7 9 Seřazené pole: 1 1 2 3 4 5 5 7 9 9 Radix sort pseudokód function radixsort(string s) for i in (s.length - 1) -> 0 do stablesort(s[i]) //radi od nejnizsi hodnoty - vnitrni stabilni razeni: counting sort //dimension = rozmer dat (fixni) public static int[] radixsort(int[] a, int dimension){ for(int i = dimension - 1; i >= 0 ; i--){ a = countingsortforradix(a, i); //stabilne serad dle i-te pozice return a; //Counting sort pro Radix sort - radi pole dle hodnoty na pozici //position = pozice, podle ktere se bude radit public static int[] countingsortforradix (int[] a, int position) { // pole do ktereho budeme radit, v pripade primitiv nema smysl // da se radit i bez nej, ale v pripade objektu by to jinak neslo int[] a2 = new int[a.length]; // najdeme maximum a minimum int min = a[0]; int max = a[0]; for(int i = 1; i < a.length; i++) { if(a[i] < min) min = a[i]; else if(a[i] > max) max = a[i];

// vytvorime pole do ktereho budeme pocitat int[] counts = new int[max - min + 1]; // zinicializujeme pocty vyskytu for(int i = 0; i < a.length; i++) { counts[a[i] - min]++; // prepocitame vyskyty na posledni index dane hodnoty counts[0]--; for(int i = 1; i < counts.length; i++) { counts[i] = counts[i] + counts[i-1]; // Serad pole zprava doleva // 1) vyhledej posledni vyskyt dane hodnoty v poli vyskutu // 2) uloz hodnotu na prislusne misto v serazenem poli // 3) sniz index posledniho vyskytu dane hodnoty // 4) pokracuj s predchozi hodnotou vstupniho pole (goto: 1), terminuj, pokud jiz vsechny hodnoty byly zarazeny for(int i = a.length - 1; i >= 0; i--) { a2[counts[a[i] - min]--] = a[i]; return a2; Bucket sort //bucketcount = pocet bucketu //return serazene pole (od nejmensiho k nejvyssimu) public static int[] bucketsort(int[] a, int bucketcount){ if(bucketcount <= 0) throw new IllegalArgumentException("Neplatny pocet bucketu"); if(a.length <= 1) return a; //trivialne serazeno int high = a[0]; int low = a[0]; for(int i = 1; i < a.length; i++){ if(a[i] > high) high = a[i]; if(a[i] < low) low = a[i]; //najdeme nejvyssi a nejnizsi double interval = ((double)(high - low + 1))/bucketCount; //pocet cisel krytych jednim bucketem = pocet_cisel_celkem/pocet_bucketu ArrayList<Integer> buckets[] = new ArrayList[bucketCount]; for(int i = 0; i < bucketcount; i++){ //inicializace bucketu buckets[i] = new ArrayList();

for(int i = 0; i < a.length; i++){ //rozhozeni cisel do bucketu buckets[(int)((a[i] - low)/interval)].add(a[i]); int pointer = 0; for(int i = 0; i < buckets.length; i++){ return a; Collections.sort(buckets[i]); for(int j = 0; j < buckets[i].size(); j++){ //sesypat zpet a[pointer] = buckets[i].get(j); pointer++; //mergesort