Bonjour,
Je suis actuellement "coincé" sur le tri de shell, je comprends le
fonctionnementde ce tri mais je n'arrive pas aller jusqu'au bout avec
ce code :
Je suis bloqué avec while ( saut > 1 ).
Pour un simple tableau avec 6 valeurs numériques :
n = 6 ;
saut = n / 2 = 3
m < n - saut ou m < 3
à la fin de l'iteration (m = 0 k = 3), (m = 1 k = 4), (m = 2 k = 6) ;
je comprends que je quitte la boucle do {...} while ( !termine ) ;
pour me retrouver dans : while ( saut > 1 ) { ... et saut /= 2 ;
Mais comme la variable saut contient 3 puisque n = 6 ..., le code
devrait s'arreter à cet endroit au lieu de continuer avec (m = 0 k > 2), (m = 1 k = 3), (m = 2 k = 5)
pour finir avec le tri de shell et
continuer par la suite avec un tri normal m, m+1.
Bonjour,
Je suis actuellement "coincé" sur le tri de shell, je comprends le
fonctionnementde ce tri mais je n'arrive pas aller jusqu'au bout avec
ce code :
Je suis bloqué avec while ( saut > 1 ).
Pour un simple tableau avec 6 valeurs numériques :
n = 6 ;
saut = n / 2 = 3
m < n - saut ou m < 3
à la fin de l'iteration (m = 0 k = 3), (m = 1 k = 4), (m = 2 k = 6) ;
je comprends que je quitte la boucle do {...} while ( !termine ) ;
pour me retrouver dans : while ( saut > 1 ) { ... et saut /= 2 ;
Mais comme la variable saut contient 3 puisque n = 6 ..., le code
devrait s'arreter à cet endroit au lieu de continuer avec (m = 0 k > 2), (m = 1 k = 3), (m = 2 k = 5)
pour finir avec le tri de shell et
continuer par la suite avec un tri normal m, m+1.
Bonjour,
Je suis actuellement "coincé" sur le tri de shell, je comprends le
fonctionnementde ce tri mais je n'arrive pas aller jusqu'au bout avec
ce code :
Je suis bloqué avec while ( saut > 1 ).
Pour un simple tableau avec 6 valeurs numériques :
n = 6 ;
saut = n / 2 = 3
m < n - saut ou m < 3
à la fin de l'iteration (m = 0 k = 3), (m = 1 k = 4), (m = 2 k = 6) ;
je comprends que je quitte la boucle do {...} while ( !termine ) ;
pour me retrouver dans : while ( saut > 1 ) { ... et saut /= 2 ;
Mais comme la variable saut contient 3 puisque n = 6 ..., le code
devrait s'arreter à cet endroit au lieu de continuer avec (m = 0 k > 2), (m = 1 k = 3), (m = 2 k = 5)
pour finir avec le tri de shell et
continuer par la suite avec un tri normal m, m+1.
wrote:
> Bonjour,
> Je suis actuellement "coinc " sur le tri de shell, je comprends le
> fonctionnementde ce tri mais je n'arrive pas aller jusqu'au bout avec
> ce code :
<snip>
> Je suis bloqu avec while ( saut > 1 ).
> Pour un simple tableau avec 6 valeurs num riques :
> n = 6 ;
> saut = n / 2 = 3
> m < n - saut ou m < 3
> la fin de l'iteration (m = 0 k = 3), (m = 1 k = 4), (m = 2 k = 6) ;
> je comprends que je quitte la boucle do {...} while ( !termine ) ;
> pour me retrouver dans : while ( saut > 1 ) { ... et saut /= 2 ;
> Mais comme la variable saut contient 3 puisque n = 6 ..., le code
> devrait s'arreter cet endroit au lieu de continuer avec (m = 0 k =
> 2), (m = 1 k = 3), (m = 2 k = 5)
Tu as loup une tape.
> pour finir avec le tri de shell et
> continuer par la suite avec un tri normal m, m+1.
De quoi parles tu?? Il n'y a pas de fin de "tri de shell" pour passer
un "tri normal" ?
Bref, si tu ne comprends pas le fonctionnement du code, une bonne
fa on de faire est de mettre des traces un peu partout et de faire affich er
tes
variables.
Voici ce que a donne, par exemple :
void tri_shell(int *t, int n)
{
int saut, m, k, termine;
printf("DEBUT fonction.n");
saut = n;
printf("[Avant Premier While] saut = %dn", saut);
while(saut>1)
{
printf(" [Dans while avant division] saut = %dn", s aut);
saut /= 2;
printf(" [Danswhile apres division] saut = %dn", sa ut);
do
{
printf(" [dans do, entree] saut = %d n", saut);
termine = 1;
for(m=0; m<(n-saut); m++)
{
k = m + saut;
if( *(t+m) > *(t+k) )
{
permuter(t+m, t+k);
printf(" [Dans For, PERMUT] [m=%d, k=%d]n", m,k);
termine = 0;
}
}
printf(" [Dans do, avant test sortie] t ermine = %dn",
termine);
}while(!termine);
printf(" [Apres do]n");
}
printf(" [Apres Premier While]n");
printf("FIN fonction.n");
}
Si maitenant tu remplis un table de 6 l ments avec des valeurs
d croissantes (6,5,4,3,2,1) par exemple, la sortie ressemblera ceci :
DEBUT fonction.
[Avant Premier While] saut = 6
[Dans while avant division] saut = 6
[Danswhile apres division] saut = 3
[dans do, entree] saut = 3
[Dans For, PERMUT] [m=0, k=3]
[Dans For, PERMUT] [m=1, k=4]
[Dans For, PERMUT] [m=2, k=5]
[Dans do, avant test sortie] termine = 0
[dans do, entree] saut = 3
[Dans do, avant test sortie] termine = 1
[Apres do]
[Dans while avant division] saut = 3
[Danswhile apres division] saut = 1
[dans do, entree] saut = 1
[Dans For, PERMUT] [m=0, k=1]
[Dans For, PERMUT] [m=1, k=2]
[Dans For, PERMUT] [m=3, k=4]
[Dans For, PERMUT] [m=4, k=5]
[Dans do, avant test sortie] termine = 0
[dans do, entree] saut = 1
[Dans For, PERMUT] [m=0, k=1]
[Dans For, PERMUT] [m=3, k=4]
[Dans do, avant test sortie] termine = 0
[dans do, entree] saut = 1
[Dans do, avant test sortie] termine = 1
[Apres do]
[Apres Premier While]
FIN fonction.
1) Si tu ne comprends toujours pas, il suffit d'ajouter des traces.
2) Si ce ne va toujours pas, retourner en 1)
Bonne suite !
Cordialement,
--
Jean-marc
bpascal...@googlemail.com wrote:
> Bonjour,
> Je suis actuellement "coinc " sur le tri de shell, je comprends le
> fonctionnementde ce tri mais je n'arrive pas aller jusqu'au bout avec
> ce code :
<snip>
> Je suis bloqu avec while ( saut > 1 ).
> Pour un simple tableau avec 6 valeurs num riques :
> n = 6 ;
> saut = n / 2 = 3
> m < n - saut ou m < 3
> la fin de l'iteration (m = 0 k = 3), (m = 1 k = 4), (m = 2 k = 6) ;
> je comprends que je quitte la boucle do {...} while ( !termine ) ;
> pour me retrouver dans : while ( saut > 1 ) { ... et saut /= 2 ;
> Mais comme la variable saut contient 3 puisque n = 6 ..., le code
> devrait s'arreter cet endroit au lieu de continuer avec (m = 0 k =
> 2), (m = 1 k = 3), (m = 2 k = 5)
Tu as loup une tape.
> pour finir avec le tri de shell et
> continuer par la suite avec un tri normal m, m+1.
De quoi parles tu?? Il n'y a pas de fin de "tri de shell" pour passer
un "tri normal" ?
Bref, si tu ne comprends pas le fonctionnement du code, une bonne
fa on de faire est de mettre des traces un peu partout et de faire affich er
tes
variables.
Voici ce que a donne, par exemple :
void tri_shell(int *t, int n)
{
int saut, m, k, termine;
printf("DEBUT fonction.n");
saut = n;
printf("[Avant Premier While] saut = %dn", saut);
while(saut>1)
{
printf(" [Dans while avant division] saut = %dn", s aut);
saut /= 2;
printf(" [Danswhile apres division] saut = %dn", sa ut);
do
{
printf(" [dans do, entree] saut = %d n", saut);
termine = 1;
for(m=0; m<(n-saut); m++)
{
k = m + saut;
if( *(t+m) > *(t+k) )
{
permuter(t+m, t+k);
printf(" [Dans For, PERMUT] [m=%d, k=%d]n", m,k);
termine = 0;
}
}
printf(" [Dans do, avant test sortie] t ermine = %dn",
termine);
}while(!termine);
printf(" [Apres do]n");
}
printf(" [Apres Premier While]n");
printf("FIN fonction.n");
}
Si maitenant tu remplis un table de 6 l ments avec des valeurs
d croissantes (6,5,4,3,2,1) par exemple, la sortie ressemblera ceci :
DEBUT fonction.
[Avant Premier While] saut = 6
[Dans while avant division] saut = 6
[Danswhile apres division] saut = 3
[dans do, entree] saut = 3
[Dans For, PERMUT] [m=0, k=3]
[Dans For, PERMUT] [m=1, k=4]
[Dans For, PERMUT] [m=2, k=5]
[Dans do, avant test sortie] termine = 0
[dans do, entree] saut = 3
[Dans do, avant test sortie] termine = 1
[Apres do]
[Dans while avant division] saut = 3
[Danswhile apres division] saut = 1
[dans do, entree] saut = 1
[Dans For, PERMUT] [m=0, k=1]
[Dans For, PERMUT] [m=1, k=2]
[Dans For, PERMUT] [m=3, k=4]
[Dans For, PERMUT] [m=4, k=5]
[Dans do, avant test sortie] termine = 0
[dans do, entree] saut = 1
[Dans For, PERMUT] [m=0, k=1]
[Dans For, PERMUT] [m=3, k=4]
[Dans do, avant test sortie] termine = 0
[dans do, entree] saut = 1
[Dans do, avant test sortie] termine = 1
[Apres do]
[Apres Premier While]
FIN fonction.
1) Si tu ne comprends toujours pas, il suffit d'ajouter des traces.
2) Si ce ne va toujours pas, retourner en 1)
Bonne suite !
Cordialement,
--
Jean-marc
wrote:
> Bonjour,
> Je suis actuellement "coinc " sur le tri de shell, je comprends le
> fonctionnementde ce tri mais je n'arrive pas aller jusqu'au bout avec
> ce code :
<snip>
> Je suis bloqu avec while ( saut > 1 ).
> Pour un simple tableau avec 6 valeurs num riques :
> n = 6 ;
> saut = n / 2 = 3
> m < n - saut ou m < 3
> la fin de l'iteration (m = 0 k = 3), (m = 1 k = 4), (m = 2 k = 6) ;
> je comprends que je quitte la boucle do {...} while ( !termine ) ;
> pour me retrouver dans : while ( saut > 1 ) { ... et saut /= 2 ;
> Mais comme la variable saut contient 3 puisque n = 6 ..., le code
> devrait s'arreter cet endroit au lieu de continuer avec (m = 0 k =
> 2), (m = 1 k = 3), (m = 2 k = 5)
Tu as loup une tape.
> pour finir avec le tri de shell et
> continuer par la suite avec un tri normal m, m+1.
De quoi parles tu?? Il n'y a pas de fin de "tri de shell" pour passer
un "tri normal" ?
Bref, si tu ne comprends pas le fonctionnement du code, une bonne
fa on de faire est de mettre des traces un peu partout et de faire affich er
tes
variables.
Voici ce que a donne, par exemple :
void tri_shell(int *t, int n)
{
int saut, m, k, termine;
printf("DEBUT fonction.n");
saut = n;
printf("[Avant Premier While] saut = %dn", saut);
while(saut>1)
{
printf(" [Dans while avant division] saut = %dn", s aut);
saut /= 2;
printf(" [Danswhile apres division] saut = %dn", sa ut);
do
{
printf(" [dans do, entree] saut = %d n", saut);
termine = 1;
for(m=0; m<(n-saut); m++)
{
k = m + saut;
if( *(t+m) > *(t+k) )
{
permuter(t+m, t+k);
printf(" [Dans For, PERMUT] [m=%d, k=%d]n", m,k);
termine = 0;
}
}
printf(" [Dans do, avant test sortie] t ermine = %dn",
termine);
}while(!termine);
printf(" [Apres do]n");
}
printf(" [Apres Premier While]n");
printf("FIN fonction.n");
}
Si maitenant tu remplis un table de 6 l ments avec des valeurs
d croissantes (6,5,4,3,2,1) par exemple, la sortie ressemblera ceci :
DEBUT fonction.
[Avant Premier While] saut = 6
[Dans while avant division] saut = 6
[Danswhile apres division] saut = 3
[dans do, entree] saut = 3
[Dans For, PERMUT] [m=0, k=3]
[Dans For, PERMUT] [m=1, k=4]
[Dans For, PERMUT] [m=2, k=5]
[Dans do, avant test sortie] termine = 0
[dans do, entree] saut = 3
[Dans do, avant test sortie] termine = 1
[Apres do]
[Dans while avant division] saut = 3
[Danswhile apres division] saut = 1
[dans do, entree] saut = 1
[Dans For, PERMUT] [m=0, k=1]
[Dans For, PERMUT] [m=1, k=2]
[Dans For, PERMUT] [m=3, k=4]
[Dans For, PERMUT] [m=4, k=5]
[Dans do, avant test sortie] termine = 0
[dans do, entree] saut = 1
[Dans For, PERMUT] [m=0, k=1]
[Dans For, PERMUT] [m=3, k=4]
[Dans do, avant test sortie] termine = 0
[dans do, entree] saut = 1
[Dans do, avant test sortie] termine = 1
[Apres do]
[Apres Premier While]
FIN fonction.
1) Si tu ne comprends toujours pas, il suffit d'ajouter des traces.
2) Si ce ne va toujours pas, retourner en 1)
Bonne suite !
Cordialement,
--
Jean-marc
Je suis bloqué avec while ( saut > 1 ).
Pour un simple tableau avec 6 valeurs numériques :
n = 6 ;
saut = n / 2 = 3
m < n - saut ou m < 3
à la fin de l'iteration (m = 0 k = 3), (m = 1 k = 4), (m = 2 k = 6) ;
je comprends que je quitte la boucle do {...} while ( !termine ) ;
pour me retrouver dans : while ( saut > 1 ) { ... et saut /= 2 ;
Mais comme la variable saut contient 3 puisque n = 6 ..., le code
devrait s'arreter à cet endroit au lieu de continuer avec (m = 0 k
Il existe de nombreuses versions de cet algorithmes plus ou moins
facile à comprendre, comme je considère ce tutoriel suffisant pour mon
niveau, je ne vois pas l'utilité d'appliquer un autre code peut-être
plus performant...
Je suis bloqué avec while ( saut > 1 ).
Pour un simple tableau avec 6 valeurs numériques :
n = 6 ;
saut = n / 2 = 3
m < n - saut ou m < 3
à la fin de l'iteration (m = 0 k = 3), (m = 1 k = 4), (m = 2 k = 6) ;
je comprends que je quitte la boucle do {...} while ( !termine ) ;
pour me retrouver dans : while ( saut > 1 ) { ... et saut /= 2 ;
Mais comme la variable saut contient 3 puisque n = 6 ..., le code
devrait s'arreter à cet endroit au lieu de continuer avec (m = 0 k
Il existe de nombreuses versions de cet algorithmes plus ou moins
facile à comprendre, comme je considère ce tutoriel suffisant pour mon
niveau, je ne vois pas l'utilité d'appliquer un autre code peut-être
plus performant...
Je suis bloqué avec while ( saut > 1 ).
Pour un simple tableau avec 6 valeurs numériques :
n = 6 ;
saut = n / 2 = 3
m < n - saut ou m < 3
à la fin de l'iteration (m = 0 k = 3), (m = 1 k = 4), (m = 2 k = 6) ;
je comprends que je quitte la boucle do {...} while ( !termine ) ;
pour me retrouver dans : while ( saut > 1 ) { ... et saut /= 2 ;
Mais comme la variable saut contient 3 puisque n = 6 ..., le code
devrait s'arreter à cet endroit au lieu de continuer avec (m = 0 k
Il existe de nombreuses versions de cet algorithmes plus ou moins
facile à comprendre, comme je considère ce tutoriel suffisant pour mon
niveau, je ne vois pas l'utilité d'appliquer un autre code peut-être
plus performant...
> > pour me retrouver dans : while ( saut > 1 ) { ... et saut /= 2 ;
> Mais comme la variable saut contient 3 puisque n = 6 ..., le code
> devrait s'arreter à cet endroit au lieu de continuer avec (m = 0 k =
> > pour me retrouver dans : while ( saut > 1 ) { ... et saut /= 2 ;
> Mais comme la variable saut contient 3 puisque n = 6 ..., le code
> devrait s'arreter à cet endroit au lieu de continuer avec (m = 0 k =
> > pour me retrouver dans : while ( saut > 1 ) { ... et saut /= 2 ;
> Mais comme la variable saut contient 3 puisque n = 6 ..., le code
> devrait s'arreter à cet endroit au lieu de continuer avec (m = 0 k =
Et je maintiens ce que je dis plus haut : je trouve les boucles
imbriquées while (...) { ... do
{ ... } while (...) ; } moins évidentes que les boucles for...
Voici le même algorithme d'un autre site que je trouve plus évident
mais je préfèrre le style du premier code que je trouve plus élégant,
c'est pourquoi j'ai cherché à comprendre :
void shellsort(int a[],int n)
{
int j,i,k,m,mid;
for(m = n/2 ; m>0 ; m/=2)
{
for(j = m ; j< n ; j++)
{
for(i=j-m ; i>=0 ; i-=m)
{
if(a[i+m]>=a[i])
break;
else
{
mid = a[i];
a[i] = a[i+m];
a[i+m] = mid;
}
}
}
}
}
Et je maintiens ce que je dis plus haut : je trouve les boucles
imbriquées while (...) { ... do
{ ... } while (...) ; } moins évidentes que les boucles for...
Voici le même algorithme d'un autre site que je trouve plus évident
mais je préfèrre le style du premier code que je trouve plus élégant,
c'est pourquoi j'ai cherché à comprendre :
void shellsort(int a[],int n)
{
int j,i,k,m,mid;
for(m = n/2 ; m>0 ; m/=2)
{
for(j = m ; j< n ; j++)
{
for(i=j-m ; i>=0 ; i-=m)
{
if(a[i+m]>=a[i])
break;
else
{
mid = a[i];
a[i] = a[i+m];
a[i+m] = mid;
}
}
}
}
}
Et je maintiens ce que je dis plus haut : je trouve les boucles
imbriquées while (...) { ... do
{ ... } while (...) ; } moins évidentes que les boucles for...
Voici le même algorithme d'un autre site que je trouve plus évident
mais je préfèrre le style du premier code que je trouve plus élégant,
c'est pourquoi j'ai cherché à comprendre :
void shellsort(int a[],int n)
{
int j,i,k,m,mid;
for(m = n/2 ; m>0 ; m/=2)
{
for(j = m ; j< n ; j++)
{
for(i=j-m ; i>=0 ; i-=m)
{
if(a[i+m]>=a[i])
break;
else
{
mid = a[i];
a[i] = a[i+m];
a[i+m] = mid;
}
}
}
}
}