Skip to main content

C implementation of Quicksort algorithm

· 3 min read
Saverio Ferrara
Software Engineer

Quicksort è un ottimo algoritmo di ordinamento ricorsivo in place che, come merge sort, si basa sul paradigma divide et impera. La base del suo funzionamento è l'utilizzo ricorsivo della procedura partition: preso un elemento da una struttura dati (es. array) si pongono gli elementi minori a sinistra rispetto a questo e gli elementi maggiori a destra.

Il Quicksort, termine che tradotto letteralmente in italiano indica ordinamento rapido, è l'algoritmo di ordinamento che ha, in generale, prestazioni migliori tra quelli basati su confronto; è stato sottoposto a un'analisi matematica approfondita ed estremamente precisa, tanto che le sue prestazioni sono state comprese a fondo e il suo comportamento è stato descritto in modo molto accurato.

I risultati ottenuti in fase di analisi sono stati verificati sperimentalmente in modo esteso e l'algoritmo di base è stato migliorato al punto da diventare il metodo ideale per un gran numero di applicazioni pratiche.

tratto da wikipedia

Per la sua estrema facilità è stato scelto in molte librerie di linguaggi, come il C, di implementare di base una funzione che effettui l'ordinamento del Quicksort... però il nostro professore di programmazione vuole vedere il codice sorgente :-)

Codice C Quicksort

Eccolo qua:

#include <stdio.h>
#define MAX 20

stampavettore(int *vettore,int n)
{
int i;

for(i=0 ; i<=n ; printf("%d ",vettore[i++]));
}

int riempivettore(int *vettore)
{
int i;

i=0;
do {
printf("inserire l'elemento %d dell'array('-1' per terminare): ",i+1);
scanf("%d",vettore+i);
} while (vettore[i++] != -1);
return i-2;
}

void scambia(int *n1,int *n2)
{
int temp;

temp = *n1;
*n1 = *n2;
*n2 = temp;
}

int partiziona(int *vettore, int p, int r)
{
int x = vettore[p];
int i = p-1;
int j = r+1;
int itera = 1;

do {
for(; vettore[--j] > x ;);
for(; vettore[++i] < x ;);

if (i < j)
{
scambia(&vettore[i],&vettore[j]);
}
else
{
itera = 0;
}
} while (itera);

return j;
}

void quicksort(int *vettore, int p, int r)
{
int q;

if (p < r)
{
q = partiziona(vettore,p,r);
quicksort(vettore,p,q);
quicksort(vettore,q+1,r);
}
}

main()
{
int vettore[MAX];
int n; /*numero di elementi*/

n=riempivettore(vettore);

quicksort(vettore,0,n);

stampavettore(vettore,n);
}

Caratteristiche del Quicksort

Struttura dati

Variabile

Caso pessimo temporalmente

Θ(n2)

Caso ottimo temporalmente

Θ(nlogn)

Caso medio temporalmente

Θ(nlogn) confronti

Caso pessimo spazialmente

Dipende dalle implementazioni

Ottimale

Spesso