home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.disi.unige.it
/
2015-02-11.ftp.disi.unige.it.tar
/
ftp.disi.unige.it
/
pub
/
.person
/
CataniaB
/
teach-act
/
esempi
/
Ordinamenti
/
merge.c
next >
Wrap
C/C++ Source or Header
|
1997-05-15
|
1KB
|
73 lines
/* Mergesort: ordinamento ricorsivo di un array.
*/
#include <stdio.h>
#define MAX 20
void merge(int a[],int inf,int med, int sup)
/* fondo i due pezzi ordinati dell'array a [inf-med e med+1-sup]
* mantenendo il tutto ordinato.
*/
{ int b[MAX];
int i,j,k,m;
i=inf;
j=med+1;
k=inf;
while ((i<=med) && (j<=sup))
if (a[i]<a[j]) b[k++]=a[i++];
else b[k++]=a[j++];
if (i<=med)
for(m=i; m<=med; m++) b[k++]=a[m];
for(m=inf; m<k; m++) a[m]=b[m];
}
void msort (int a[],int inf,int sup)
{
int med,i,temp;
if (inf < sup)
{
med=(inf+sup)/2; /* con troncamento */
temp=med+1;
msort(a,inf,med); /* ordino la prima meta inf-med */
printf("\n Ho ordinato da %d a %d",inf,med);
for(i=inf;i<=med;i++) printf(" %d",a[i]);
msort(a,temp,sup); /* ordino la seconda meta med+1-sup */
printf("\n Ho ordinato da %d a %d",temp,sup);
for(i=temp;i<=sup;i++) printf(" %d",a[i]);
printf("\n");
merge(a,inf,med,sup); /* fondo le due parti */
}
}
/* esempio di chiamata */
void main(void)
{ int a[MAX];
int i,n;
printf("Dimensione?[Max:20]");
scanf("%d",&n);
if (n>MAX) printf("\n Dimensione > %d",MAX);
else
{
printf("Input?\n");
for(i=0;i<n;i++) scanf("%d",&a[i]);
printf("Echo\n");
for(i=0;i<n;i++) printf(" %d",a[i]);
msort(a,0,n-1);
printf("\nOutput\n");
for(i=0;i<n;i++) printf(" %d",a[i]);
}
}