ORDINAMENTO Esistono moltissimi algoritmi che permettono di ordinare cose. Io ho affronterò i più famosi. SCAMBIO Il più semplice di tutti è il bubble sort. Si comporta esattamente come noi quando mettiamo a posto un mazzo di carte. Prendiamo una singola carta e la confrontiamo con tutte quelle già messe per trovare la posizione esatta. Questo algoritmo fa parte degli algoritmi di scambio poiché si basa su sostituzioni continue di dati. void bubble_sort(TYPE *array, int count) { register int a,b; TYPE tmp; for(a=0;a=a;--b) { if(array[b-1]>array[b]) { tmp=array[b-1]; array[b-1]=array[b]; array[b]=tmp; } } } } Sequenza: DCAB ADCB ABDC ABCD Numero di confronti effettuati: 1/2(n^2 - n) Modifica semplice al bubble sort è quella che genera il shaker sort. Ordinare in entrambi i sensi. Non si ottiene alcun miglioramento di prestazioni. void shaker_sort(TYPE *array, int count) { register int a,b; TYPE tmp; do { b=0; for(a=count-1;a>0;--a) { if(array[a-1]>array[a]) { tmp=array[a-1]; array[a-1]=array[a]; array[a]=tmp; b=1; } } for(a=1;aarray[a]) { tmp=array[a-1]; array[a-1]=array[a]; array[a]=tmp; b=1; } } } while(b); } SELEZIONE Altra famiglia di algoritmi sono quelli di selezione detto così perché selezionano l'elemento più basso o lo scambia col primo elemento. Così via per i prossimi n-1 casi. Si ottiene un numero di confronti pari a 1/2(n^2-n) con un codice no ricorsivo come questo: void selection_sort(TYPE *array, int count) { register int a,b,c; int d; TYPE tmp; for(a=0;a=0 && tmp=0; j=j-gap) array[j+gap]=array[j]; array[j+gap]=x; } } } /*** ALGORITMI DI RICORRENZA ***/ /* Counting sort */ void counting_sort(TYPE *array, int count) { register int x; TYPE *c,*b,k; for(x=0;x-1;--x) b[(c[array[x]-1]--)-1]=array[x]; for(x=0;x0; i--) { TYPE tmp; tmp=array[i]; array[i]=array[0]; array[0]=tmp; heap_heapify(array, 0, --count); } } L'algoritmo più veloce mai creato è il QUICK SORT. Algoritmo ricorsivo di scambio. - Confronti: n log n - Sostituzione: n/6 log n void quick_sort_recursive(TYPE *array, int sx, int dx) { register int i,j; TYPE x,y; i=sx; j=dx; x=array[(sx+dx)/2]; do { while(array[i]sx) j--; if(i<=j) { y=array[i]; array[i]=array[j]; array[j]=y; i++; j--; } } while(i<=j); if(sx