qsort

se è proprio necessario effettuare un ordinamento, procedura lenta con gli algoritmi "tradizionali", conviene utilizzare la funzione qsort.

qsort è funzione di ordinamento su array contenuta nella stdlib.h, con prototipo

void qsort(void A,int n,int dim, int(compare)(const void*,const void*));

dove:

A: array da ordinare

n: numero di elementi dell’array

dim: dimensione di un elemento dell’array (sizeof())

compare: funzione di confronto tra un elemento a e b del’array; ritorna 0 se a=b, valore positivo se a>b, valore negativo in caso contrario

vediamo alcuni esempi

ESEMPIO DI QSORT CON ARRAY DI INTERI

#include <stdio.h>#include <stdlib.h>#define MAX 5int confronta(const void *,const void *); //per ordinamento crescenteint confrontaD(const void *,const void *);//per ordinamento decrescentevoid visualizza(int,int*); main() {int v[MAX]={3,2,4,1,2}; qsort(v,MAX,sizeof(int),confronta); visualizza(MAX,v); qsort(v,MAX,sizeof(int),confrontaD); visualizza(MAX,v); getch();} int confronta(const void *a,const void *b) //0 se a=b/ >0 se a>b/ <0 se a<b {return (*(int *)a-*(int *)b);}//crescenteint confrontaD(const void *b,const void *a) //0 se a=b/ >0 se a>b/ <0 se a<b {return (*(int *)a-*(int *)b);}//decrescente (invertendo i parametrivoid visualizza(int n,int*v) {int i; for(i=0;i<n;i++) printf("%d ",v[i]); printf("\n");}

in modo analogo per array di float (usando float al posto di int) e di char (v. sotto)

ESEMPIO DI QSORT CON ARRAY DI CHAR

#include <stdio.h>#include <stdlib.h>#define MAX 5int confronta(const void *,const void *); //per ordinamento crescenteint confrontaD(const void *,const void *);//per ordinamento decrescentevoid visualizza(int,char*); main() {char v[MAX]={'c','i','a','o','1'}; qsort(v,MAX,sizeof(char),confronta); visualizza(MAX,v); qsort(v,MAX,sizeof(char),confrontaD); visualizza(MAX,v); getch();} int confronta(const void *a,const void *b) //0 se a=b/ >0 se a>b/ <0 se a<b {return (*(char *)a-*(char *)b);}//crescenteint confrontaD(const void *b,const void *a) //0 se a=b/ >0 se a>b/ <0 se a<b {return (*(char *)a-*(char *)b);}//decrescente (invertendo i parametrivoid visualizza(int n,char*v) {int i; for(i=0;i<n;i++) printf("%c ",v[i]); printf("\n");}

ESEMPIO DI QSORT CON ARRAY DI STRINGHE

#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAX 5int confronta(const void *,const void *); //per ordinamento crescenteint confrontaD(const void *,const void *);//per ordinamento decrescentevoid visualizza(int,char**); main() {char *v[]={"enrica","pippo","pluto","topolino","paperino"}; qsort(v,MAX,sizeof(char*),confronta); visualizza(MAX,v); qsort(v,MAX,sizeof(char*),confrontaD); visualizza(MAX,v); getch();} int confronta(const void *a,const void *b) //0 se a=b/ >0 se a>b/ <0 se a<b {return strcmp(*(char **)a,*(char **)b);}//crescenteint confrontaD(const void *b,const void *a) //0 se a=b/ >0 se a>b/ <0 se a<b {return strcmp(*(char **)a,*(char **)b);}//decrescente (invertendo i parametrivoid visualizza(int n,char **v) {int i; for(i=0;i<n;i++) printf("%s ",v[i]); printf("\n");}

ESEMPIO DI QSORT CON ARRAY DI STRUCT (PUNTO)

#include <stdio.h>#include <stdlib.h>#define MAX 5typedef struct {float x,y;}punto; int confrontaX(const void *,const void *); //per ordinamento crescente di xint confrontaXD(const void *,const void *);//per ordinamento decrescente di xint confrontaY(const void *,const void *); //per ordinamento crescente di yint confrontaYD(const void *,const void *);//per ordinamento decrescente di yvoid visualizza(int,punto*); main() {punto v[MAX]={3,2, 4,1, 2,2, -4,1, -3,2}; qsort(v,MAX,sizeof(punto),confrontaX); printf("crescente per x\n"); visualizza(MAX,v); qsort(v,MAX,sizeof(punto),confrontaXD); printf("\ndecrescente per x\n"); visualizza(MAX,v); qsort(v,MAX,sizeof(punto),confrontaY); printf("\ncrescente per y\n"); visualizza(MAX,v); qsort(v,MAX,sizeof(punto),confrontaYD); printf("\ndecrescente per y\n"); visualizza(MAX,v); getch();} int confrontaX(const void *a,const void *b) //0 se a=b/ >0 se a>b/ <0 se a<b {punto *ia=(punto*)a; punto *ib=(punto*)b; return (ia->x-ib->x);}//crescente per xint confrontaXD(const void *b,const void *a) //0 se a=b/ >0 se a>b/ <0 se a<b {punto *ia=(punto*)a; punto *ib=(punto*)b; return (ia->x-ib->x);}//decrescente per xint confrontaY(const void *a,const void *b) //0 se a=b/ >0 se a>b/ <0 se a<b {punto *ia=(punto*)a; punto *ib=(punto*)b; return (ia->y-ib->y);}//crescente per yint confrontaYD(const void *b,const void *a) //0 se a=b/ >0 se a>b/ <0 se a<b {punto *ia=(punto*)a; punto *ib=(punto*)b; return (ia->y-ib->y);}//decrescente per yvoid visualizza(int n,punto*v) {int i; for(i=0;i<n;i++) printf("%0.2f %0.2f\n",v[i].x,v[i].y);