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
/
quick.c
< prev
next >
Wrap
C/C++ Source or Header
|
1997-05-15
|
2KB
|
78 lines
#include <stdio.h>
#define MAX 20
void swap(int a[],int i,int j);
/* scambia i valori delle due caselle a[i] e a[j] */
int select(int a[],int inf,int med,int sup);
/* partiziona a in inf-(med-1) (elementi piu' piccoli del pivot)
e med+1-sup elementi piu' grandi del pivot */
void quick(int a[],int inf,int sup);
/* ordina con l'algoritmo quicksort:
- seleziona il pivot
- partiziona l'array a in elementi rispett. minori e maggiori del pivot
- ordina le due partizioni (lascia invariato il pivot)
*/
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]);
quick(a,0,n-1);
printf("\nOutput\n");
for(i=0;i<n;i++) printf(" %d",a[i]);
}
}
void swap(int a[],int i,int j)
{int temp;
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
int select(int a[],int inf,int med,int sup)
{int last,i;
last=inf;
swap(a,inf,med); /* metto il pivot al posto di a[inf] */
for(i=inf+1;i<=sup;i++)
if (a[i]<a[inf]) swap(a,++last,i); /* sposto gli elementi minori del pivot piu' a sx possibile */
swap(a,inf,last); /* risistemo il pivot */
return last;
}
void quick(int a[],int inf,int sup)
{
int pivot,med;
if (inf < sup)
{
pivot=(inf+sup)/2; /* con troncamento */
med=select(a,inf,pivot,sup);
quick(a,inf,med-1);
quick(a,med+1,sup);
}
}