01: // qsort()
02: #include<stdio.h>
03: #include<stdlib.h>
04: #include<time.h>
05: 
06: void stampaarray(int *, int);
07: int mycomp(const void*, const void*);
08: 
09: int main(int argc, char **argv){
10: 
11:   srand(time(0));
12: 
13:    int n;
14:    printf("Quanti elementi vuoi ordinare? ");
15:    scanf("%d", &n);
16: 
17:    int a[n]; // VLA e' comunque limitato come dimensioni massime
18: 
19:    // genera array, banalmente metto nel mio array tutti i numeri da 1 a n
20:    for (int i=0; i<n; i++)
21:      a[i]=(i+1);
22: 
23:    // mescola gli elementi dell'array ovvero genero una coppia a caso e scambio gli elementi
24:    for (int i=0; i<n; i++){
25:      int j = rand()%n;
26:      int t = a[i];
27:      a[i] = a[j];
28:      a[j] = t;
29:    }
30:    // visualizza array mescolato
31:    printf("ARRAY DA ORDINARE\n");
32:    stampaarray(a,n);
33: 
34: 
35:    // invoco ordinamento
36:    qsort(a, n, sizeof(a[0]), mycomp); // passo: 1. array, 2. n. elementi array, 3. dimensione ciascun elemento, 4. callback di comparazione
37: 
38:    // visualizza array ordinato
39:    printf("ARRAY ORDINATO\n");
40:    stampaarray(a,n);
41: 
42: 
43: 
44:    return 0;
45: }
46: 
47: void stampaarray(int *a, int n){
48:   int i;
49:   if(n<200)
50:   {
51:     for (i=0; i<n; i++){
52:       printf("%5d ",a[i]);
53:       printf((i+1)%15 ? "" : "\n");
54:     }
55:   }
56:   else
57:   {
58:     printf(" Array troppo grosso, mi limito a stampare i primi 30 e gli ultimi 30 elementi\n");
59: 
60:     for (i=0; i<30; i++){
61:       printf("%5d ",a[i]);
62:       printf((i+1)%15?"":"\n");
63:     }
64:      printf("  ...\n");
65:     for (i=n-30; i<n; i++){
66:       printf("%5d ",a[i]);
67:       printf((n-i-1)%15?"":"\n");
68:     }
69:   }
70: 
71:    printf("\n");
72: }
73: 
74: // deve restituire valore < = > 0 a seconda del confronto, occorre cast visto che obbligatorio usare void*
75: int mycomp(const void* a, const void* b){
76: 
77:   int ai = *((int*)a); // a e' puntatore a void (int*)a e' puntatore a int, *((int *)a) e' l'int contenuto all'indirizzo in a
78:   int bi = *((int*)b);
79: 
80:   return ai-bi;
81: }
82: 
83: 
84: 


Se avete commenti o osservaƶioni su questa pagina
mandate un messaggio di posta elettronica a bertoƶƶi@ce.unipr.it