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