// Heapsort=20 // 06.06.01 #include <stdio.h> #include <math.h> #include <stdlib.h> #include <time.h> #include <windows.h> #define ANZ 10 int a[ANZ], schritte ; void repariere=5Frek=5Fheap(int *a,int n, int w){ int i,h; i=3Dw; =09 if (i*2+1 >=3Dn)=20 return; // Falls in einem Blatt - keine Nachfolger if ((i*2+2 >=3Dn)&&(a[i*2+1] >a[i])){ // nur linker Nachfolger + Gr=F6sser a= ls knoten h =3D a[i];=09 a[i] =3D a[i*2+1]; a[i*2+1] =3D h; return; } else if (i*2+2 >=3Dn){ // nur linker Nachfolger + kleiner als knoten =09 return; } if ( i*2+2<n){ // zwei Nachfolger if ((a[i]>a[i*2+1]) && (a[i]>a[i*2+2])){ return; } else if ( a[i*2+1] > a[i*2+2] ){ // linker Nachfolger gr=F6sser als recht= er if ( a[i*2+1] > a[i]){ // linker Nachfolger gr=F6sser als Knoten h =3D a[i]; a[i] =3D a[i*2+1]; a[i*2+1] =3D h; repariere=5Frek=5Fheap(a,n,i*2+1); } } else if ( a[i*2+1] < a[i*2+2] ){// rechter Nachfolger gr=F6sser als linke= r if (a[i*2+2]>a[i]){// rechter Nachfolger gr=F6sser als Knoten h =3D a[i]; a[i] =3D a[i*2+2]; a[i*2+2] =3D h; repariere=5Frek=5Fheap(a,n,i*2+2); } } =09 =09 } } void repariere=5Fheap(int *a,int n, int w){ int i,h; i=3Dw; while (i<n){ =09 if (i*2+1 >=3Dn)=20 return; // Falls in einem Blatt - keine Nachfolger if ((i*2+2 >=3Dn)&&(a[i*2+1] >a[i])){ // nur linker Nachfolger + Gr=F6sser a= ls knoten h =3D a[i];=09 a[i] =3D a[i*2+1]; a[i*2+1] =3D h; return; } else if (i*2+2 >=3Dn){ // nur linker Nachfolger + kleiner als knoten =09 return; } if ( i*2+2<n){ // zwei Nachfolger if ((a[i]>a[i*2+1]) && (a[i]>a[i*2+2])){ return; } else if ( a[i*2+1] > a[i*2+2] ){ // linker Nachfolger gr=F6sser als recht= er if ( a[i*2+1] > a[i]){ // linker Nachfolger gr=F6sser als Knoten h =3D a[i]; a[i] =3D a[i*2+1]; a[i*2+1] =3D h; i=3Di*2+1; } } else if ( a[i*2+1] < a[i*2+2] ){// rechter Nachfolger gr=F6sser als linke= r if (a[i*2+2]>a[i]){// rechter Nachfolger gr=F6sser als Knoten h =3D a[i]; a[i] =3D a[i*2+2]; a[i*2+2] =3D h; i=3Di*2+2; } } =09 } } } void erzeuge=5Fheap( int *a, int n, int w){ =09 if ( w*2+1<n ) erzeuge=5Fheap(a,n,w*2+1); if ( w*2+2<n ) erzeuge=5Fheap(a,n,w*2+2); =09 repariere=5Frek=5Fheap(a, n, w); =09 } void heapsort ( int *a, int n ){ int i,h; erzeuge=5Fheap(a,n,0); for ( i =3D0;i<n-1;i++){ h=3D a[0]; a[0] =3D a[n-i-1]; a[n-1-i] =3Dh; repariere=5Frek=5Fheap(a,n-1-i, 0); } } void init() { =20 int i; srand( (unsigned)time( NULL ) );=09 for (i=3D0 ; i<ANZ ; i++) { a[i] =3D rand(); =09 /*printf("%i \n",a[i]);*/ } =09 } int main () { int erg =3D0,i; =09 init(); printf ("init: "); for (i=3D 0 ; i<ANZ; i++) { printf ("%5i " , a[i]); } erzeuge=5Fheap(a, ANZ, 0); printf ("\nerze: "); for (i=3D 0 ; i<ANZ; i++) { printf ("%5i " , a[i]); } heapsort(a,ANZ); printf ("\nsort: "); for (i=3D 0 ; i<ANZ; i++) { printf ("%5i " , a[i]); } } =5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F Keine verlorenen Lotto-Quittungen, keine vergessenen Gewinne mehr!=20 Beim WEB.DE Lottoservice: http://tippen2.web.de/=3Fx=3D13