Ing. Daniel Hládek PhD.
Polia
[note]
V jazyku C sa argumenty odovzdávajú vždy kópiou.
Ak by sme chceli pole odovzdať ako argument, musíme ho celé kopírovať a musíme používať vždy tú istú veľkosť.
Aby sme obišli tento problém, pole odovzdávame ako adresu jeho prvého prvku a jeho veľkosť. [/note]
int bisec(int * array,int size,int needle){
int from = 0;
int to = size;
int mid = size / 2;
while (to > from){
int r = array[\mid] - needle;
if (r == 0){
return mid;
}
else if (r > 0){
to = mid;
}
else {
from = mid + 1;
}
mid = (to - from) / 2 + from;
//printf("%d %d %d\n",from,mid,to);
}
return -1;
}
int main(){
int a1[] = {1,2,2,3,3,4};
int r = bisec(a1,6,4);
printf("%d\n",r);
return 0;
}
Binárne vyhľadávanie v zotriedenom poli je oveľa rýchlejšie ako lineárne.
void bsort(int* data, int size){
// Prejdeme všetky členy
for(int j = 0; j < size - 1; j++){
// Prejdeme všetky členy
// okrem tých na konci ktoré sú už zotriedené
for(int i = 0; i < size - 1 - j; i++){
// Vymeníme susedov tak aby napravo bol ten väčší
if(data[i+1] < data[\i]){
// swap
int tmp = data[i+1];
data[i+1] = data[\i];
data[\i] = tmp;
}
}
}
}
https://www.youtube.com/watch?v=lyZQPjUT5B4
void recursive_bsort(int* data, int size){
// Ukončovacia podmienka, pole veľkosti 1 nie je potrebné triediť
if (size < 2)
return;
// Na konci cyklu bude napravo najväčší prvok
for(int i = 0; i < size - 1; i++){
if(data[i+1] < data[i]){
// swap
int tmp = data[i+1];
data[i+1] = data[\i];
data[\i] = tmp;
}
}
// Zotriedime zvyšok poľa
recursive_bsort(data,size - 1);
}
Rekurzívna implementácia je možná aj vďaka tomu, že pole odovzdávame adresou, nie hodnotou.
Tento algoritmus si vyžaduje 2 vnorené cykly.
Donald Knuth, in The Art of Computer Programming, concluded that:
"the bubble sort seems to have nothing to recommend it, except a catchy name and the fact that it leads to some interesting theoretical problems",
Vyberieme najväčší prvok.
Vymeníme ho s posledným prvkom.
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define SIZE 10
void selection(int* array, int size){
while (size > 0){
int b = -1;
int bv = -1;
for (int i = 0; i < size; i++){
if (array[\i] >= bv){
bv = array[\i];
b = i;
}
}
bv = array[size - 1];
array[size -1] = array[\b];
array[\b] = bv;
size -= 1;
}
}
int main(){
srand(time(NULL));
int array[\SIZE];
for (int i = 0; i < SIZE; i++){
array[\i] = rand() % 100;
}
selection(array,SIZE);
for (int i = 0; i < SIZE; i++){
printf("%d ",array[\i]);
}
printf("\n");
return 0;
}
https://www.youtube.com/watch?v=ROalU379l3U
Používa sa niektorá všeobecná implementácia, napr. zo štandardnej knižnice.
http://www.cplusplus.com/reference/cstdlib/qsort/
#include <stdio.h> /* printf */
#include <stdlib.h> /* qsort */
// Správanie triedenia je ovplyvňované porovnávacou funkciou
int compare (const void * a, const void * b) {
return ( *(int*)a - *(int*)b );
}
int main () {
int values[] = { 40, 10, 100, 90, 20, 25 };
qsort (values, 6, sizeof(int), compare);
for (int n=0; n<6; n++)
printf ("%d ",values[n]);
return 0;
}
https://www.youtube.com/watch?v=ywWBy6J5gz8