Corso di Fondamenti di Informatica Prof. P.G. Franciosa a.a. 2000-2001 a cura della prof.ssa Isabella Lari Nel presente documento sono riportati i programmi C che implementano gli algoritmi di ordinamento, di ricerca binaria e di ricerca del k-mo elemento che sono stati trattati durante il corso. Per una descrizione degli algoritmi si possono consultare i seguenti testi: "Guida al linguaggio C", A. Bellini, A. Guidi (per la ricerca binaria e il bubble sort); "Introduzione agli algoritmi, vol. I", T.H. Cormen, C.E. Leiserson, R.L. Rivest (per l'insertion sort, il selection sort, il mergesort, il counting sort e la selezione del k-mo elemento) ________________________________________________________________________________ 1. Ricerca binaria iterativa #include #include #define NMAX 100 int main() { int n,i,x,a,b,h,trovato; int v[NMAX]; clrscr(); /*legge la dimensione del vettore e il vettore*/ printf("scrivi la dimensione del vettore: "); scanf("%d%",&n); i=0; while (i #include #define NMAX 100 int binaria(int *vett, int a, int b, int x) { int h; if (a>b) return(-1); else { h=(a+b)/2; if (x==vett[h]) return(h); else if (x #include void leggi_vettore(int *n,int *vett); void scambia(int *a, int *b); void stampa_vettore(int n, int *vett); main() { int v[100]; int n,i,j,kmax,max; clrscr(); leggi_vettore(&n,v); for (i=n-1;i>0;i--) { max=v[0]; kmax=0; for (j=1;j<=i;j++) { if (v[j]>max) { max=v[j]; kmax=j; } } if (kmax!=i) scambia(&v[kmax],&v[i]); } stampa_vettore(n,v); getch(); } void leggi_vettore(int *n, int *vett) { int i; printf("scrivi la dimensione del vettore (<=100): "); scanf("%d",n); for (i=0;i<*n;i++) { printf("v[%d] = ",i); scanf("%d",&vett[i]); } } void scambia(int *a, int *b) { int temp; temp=*a; *a=*b; *b=temp; } void stampa_vettore(int n, int *vett) { int i; printf("\n\n"); for (i=0;i #include #include #include void leggi_vettore(int *n,int *vett); void stampa_vettore(int n, int *vett); main() { int v[100]; int n,i,j,app; clrscr(); leggi_vettore(&n,v); stampa_vettore(n,v); for (i=1;i0) && (app #include void leggi_vettore(int *n,int *vett); void scambia(int *a, int *b); void stampa_vettore(int n, int*vett); main() { int v[100]; int n,i,j,p,k,m; clrscr(); leggi_vettore(&n,v); m=n; do { k=0; for (i=0;iv[i+1]) { scambia(&v[i],&v[i+1]); k=1; p=i+1; } } m=p; } while(k==1); stampa_vettore(n,v); getch(); } void leggi_vettore(int *n, int *vett) { int i; printf("scrivi la dimensione del vettore (<=100): "); scanf("%d",n); for (i=0;i<*n;i++) { printf("v[%d] = ",i); scanf("%d",&vett[i]); } } void scambia(int *a, int *b) { int temp; temp=*a; *a=*b; *b=temp; } void stampa_vettore(int n, int *vett) { int i; printf("\n\n"); for (i=0;i #include void leggi_vettore(int *n,int *vett); void stampa_vettore(int n, int *vett); void merge(int a1, int a2, int b2, int *vett); void mergesort(int a, int b, int *vett); main() { int v[100]; int n; clrscr(); leggi_vettore(&n,v); mergesort(0,n-1,v); stampa_vettore(n,v); getch(); } void leggi_vettore(int *n, int *vett) { int i; printf("scrivi la dimensione del vettore (<=100): "); scanf("%d",n); for (i=0;i<*n;i++) { printf("v[%d] = ",i); scanf("%d",&vett[i]); } } void stampa_vettore(int n, int *vett) { int i; printf("\n\n"); for (i=0;i=a2) app[j]=vett[i2++]; else app[j]=vett[i1++]; i=0; for (j=a1;j<=b2;j++) vett[j]=app[i++]; } void mergesort(int a, int b, int *vett) { int medio; if (a #include void leggi_vettore(int *n,int *vett); void stampa_vettore(int n, int *vett); main() { int a[100],b[100],c[100]; int n,i,j; clrscr(); leggi_vettore(&n,a); /* si ipotizza che gli elementi del vettore siano interi nell'intervallo [0,99]*/ for (j=0;j<100;j++) c[j]=0; for (i=0;i=0;i--){ b[c[a[i]]-1]=a[i]; c[a[i]]=c[a[i]]-1; } stampa_vettore(n,b); getch(); } void leggi_vettore(int *n, int *vett) { int i; printf("scrivi la dimensione del vettore (<=100): "); scanf("%d",n); for (i=0;i<*n;i++) { printf("v[%d] = ",i); scanf("%d",&vett[i]); } } void stampa_vettore(int n, int *vett) { int i; printf("\n\n"); for (i=0;i #include #include #include void leggi_vettore(int *n,int *vett); void scambia(int *p, int *q); void stampa_vettore(int n, int *vett); int partition(int *vett, int a, int b); main() { int v[100]; int n,a,b,k,q; clrscr(); leggi_vettore(&n,v); stampa_vettore(n,v); printf("scrivi quale elemento vuoi cercare: "); scanf("%d",&k); a=0; b=n-1; do { q=partition(v,a,b); if (qk-1) b=q-1; else break; } while (a < b); stampa_vettore(n,v); printf("\n il %d elemento e' %d: \n",k,v[k-1]); getch(); } void leggi_vettore(int *n, int *vett) { int i; randomize(); *n=8; for (i=0;i<*n;i++) vett[i]=random(100); } void scambia(int *p, int *q) { int temp; temp=*p; *p=*q; *q=temp; } void stampa_vettore(int n, int *vett) { int i; printf("\n\n"); for (i=0;ix)) j--; if (ix)) j--; if (i #include #include #include void leggi_vettore(int *n,int *vett); void scambia(int *p, int *q); void stampa_vettore(int n, int *vett); int partition(int *vett, int a, int b); int select(int *vett, int p, int r, int k); main() { int v[100]; int n,k; clrscr(); leggi_vettore(&n,v); stampa_vettore(n,v); printf("scrivi quale elemento vuoi cercare: "); scanf("%d",&k); printf("\n il %d elemento e' %d: \n",k,select(v,0,n-1,k)); stampa_vettore(n,v); getch(); } void leggi_vettore(int *n, int *vett) { int i; randomize(); *n=8; for (i=0;i<*n;i++) vett[i]=random(100); } void scambia(int *p, int *q) { int temp; temp=*p; *p=*q; *q=temp; } void stampa_vettore(int n, int *vett) { int i; printf("\n\n"); for (i=0;ix)) j--; if (ik) return(select(vett,p,q-1,k)); else return(vett[q]); } }