5 réponses
je souhaite preciser sur ma fonction:
dans le boucle for,
quand i prend la valeur 0,
si tableau[0] est plus grand que tableau[1]:
x=tableau[0];
tableau[0]=tableau[1];
tableau[1]=x=la valeur initiale de tableau[0]
si tableau[0] est plus petit que tableau[1]:
on ne fait rien
etc pour i= i=2...
dans le boucle for,
quand i prend la valeur 0,
si tableau[0] est plus grand que tableau[1]:
x=tableau[0];
tableau[0]=tableau[1];
tableau[1]=x=la valeur initiale de tableau[0]
si tableau[0] est plus petit que tableau[1]:
on ne fait rien
etc pour i= i=2...
[Dal]
Messages postés
6194
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
11 octobre 2024
1 092
Modifié par [Dal] le 19/01/2016 à 10:20
Modifié par [Dal] le 19/01/2016 à 10:20
Salut debutantC,
Si ton tableau a une taille de 4, tu devrais y mettre 4 valeurs (là le compilateur n'en a que 3, aussi il comble la valeur additionnelle avec un zéro).
Ensuite, ton algorithme de tri à bulle n'est pas terminé. Il faut repasser sur le tableau autant de fois que nécessaire pour vérifier si des permutations doivent être faites, et jusqu'à ce qu'aucune permutation ne soit plus nécessaire. Tous les éléments sont alors ordonnés.
Autrement dit, tu dois mettre la boucle for dans une autre boucle, pour la répéter tant que tout n'est pas trié, et ne sortir de la boucle que lorsque ta boucle for n'a aboutit à aucune permutation.
Dal
Si ton tableau a une taille de 4, tu devrais y mettre 4 valeurs (là le compilateur n'en a que 3, aussi il comble la valeur additionnelle avec un zéro).
Ensuite, ton algorithme de tri à bulle n'est pas terminé. Il faut repasser sur le tableau autant de fois que nécessaire pour vérifier si des permutations doivent être faites, et jusqu'à ce qu'aucune permutation ne soit plus nécessaire. Tous les éléments sont alors ordonnés.
Autrement dit, tu dois mettre la boucle for dans une autre boucle, pour la répéter tant que tout n'est pas trié, et ne sortir de la boucle que lorsque ta boucle for n'a aboutit à aucune permutation.
Dal
merci Dal pour la reponse
1. tableau de taille 4, la derniere case du tableau prend automatiquement la valeur 0
2. J ai ajoute un nouveau boucle pour repeter suffisament la comparaison
Par contre, j' ai un resultat 'bizarre':
10
3
0
15
=================
int main()
{
int tableau[4]={10,15,3};
ordonnerTableau(tableau, 4);
int n=0;
for(n=0;n<4;n++)
{
printf("%d\n",tableau[n]);
}
return 0;
}
void ordonnerTableau(int tableau[], int taille)
{
int i=0,j=0,x=0;
for(i=0;i<taille-1;i++)
{
for(j=0;j<taille-1;j++)
{
if(tableau[i]>tableau[i+1])
{
x=tableau[i];
tableau[i]=tableau[i+1];
tableau[i+1]=x;
}
}
}
}
1. tableau de taille 4, la derniere case du tableau prend automatiquement la valeur 0
2. J ai ajoute un nouveau boucle pour repeter suffisament la comparaison
Par contre, j' ai un resultat 'bizarre':
10
3
0
15
=================
int main()
{
int tableau[4]={10,15,3};
ordonnerTableau(tableau, 4);
int n=0;
for(n=0;n<4;n++)
{
printf("%d\n",tableau[n]);
}
return 0;
}
void ordonnerTableau(int tableau[], int taille)
{
int i=0,j=0,x=0;
for(i=0;i<taille-1;i++)
{
for(j=0;j<taille-1;j++)
{
if(tableau[i]>tableau[i+1])
{
x=tableau[i];
tableau[i]=tableau[i+1];
tableau[i+1]=x;
}
}
}
}
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 841
Modifié par fiddy le 19/01/2016 à 21:54
Modifié par fiddy le 19/01/2016 à 21:54
Bonjour,
Tu as inversé les boucles for...
Ensuite, tu fais trop d'itérations. La seconde a juste besoin d'aller de 0 à i à j.
Pour comprendre le principe du tri à bulles : https://fr.wikipedia.org/wiki/Tri_%C3%A0_bulles
Quelques commentaires sur le code :
int main()
Le bon prototype est : int main(void)
ordonnerTableau(tableau, 4);
for(n=0;n<4;n++)
Il vaut mieux mettre : sizeof tableau / sizeof *tableau à la place de 4 pour faciliter les évolutions. Tu peux aussi mettre sizeof tableau / sizeof *tableau dans une variable.
int n=0;
Pas terrible comme nom pour un compteur. Utilise plutôt i.
Pour les prochaines fois, merci de poster ton code entre 2 balises <code c>. Cela le rendra plus lisible.
Exemple :
<code c>
ici tu mets ton code
</code>
Tu as inversé les boucles for...
Ensuite, tu fais trop d'itérations. La seconde a juste besoin d'aller de 0 à i à j.
Pour comprendre le principe du tri à bulles : https://fr.wikipedia.org/wiki/Tri_%C3%A0_bulles
Quelques commentaires sur le code :
int main()
Le bon prototype est : int main(void)
ordonnerTableau(tableau, 4);
for(n=0;n<4;n++)
Il vaut mieux mettre : sizeof tableau / sizeof *tableau à la place de 4 pour faciliter les évolutions. Tu peux aussi mettre sizeof tableau / sizeof *tableau dans une variable.
int n=0;
Pas terrible comme nom pour un compteur. Utilise plutôt i.
Pour les prochaines fois, merci de poster ton code entre 2 balises <code c>. Cela le rendra plus lisible.
Exemple :
<code c>
ici tu mets ton code
</code>
merci beaucoup fiddy pour le lien, tres utile pour optimiser l argorithme !!
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 841
20 janv. 2016 à 22:23
20 janv. 2016 à 22:23
Loin de mot l'idée de vouloir jouer sur les mots, mais le lien n'avait pas pour vocation d'optimiser l'algorithme mais de l'implémenter correctement.
Si tu veux optimiser l'algorithme de tri, je te conseille plutôt le tri rapide (quick sort) : https://fr.wikipedia.org/wiki/Tri_rapide
Si tu veux optimiser l'algorithme de tri, je te conseille plutôt le tri rapide (quick sort) : https://fr.wikipedia.org/wiki/Tri_rapide
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
J ai enfin reussir! trop content !!!
<code c>
int main(int argc, char *argv[])
{
int tableau[4]={10,15,3,1};
ordonnerTableau(tableau, 4);
int a=0;
for(a=0;a<4;a++)
{
printf("%d\n",tableau[a]);
}
return 0;
}
void ordonnerTableau(int t[], int i)
{
int s = 1;
int j = 0;
int tmp = 0 ;
while((i>0) && (s=1))
{
s = 0;
for(j=0;j<i;j++)
{
if(t[j] > t[j + 1])
{
tmp = t[j];
t[j] = t[j+1];
t[j+1] = tmp;
s = 1;
}
}
i--;
}
}
</code c>
<code c>
int main(int argc, char *argv[])
{
int tableau[4]={10,15,3,1};
ordonnerTableau(tableau, 4);
int a=0;
for(a=0;a<4;a++)
{
printf("%d\n",tableau[a]);
}
return 0;
}
void ordonnerTableau(int t[], int i)
{
int s = 1;
int j = 0;
int tmp = 0 ;
while((i>0) && (s=1))
{
s = 0;
for(j=0;j<i;j++)
{
if(t[j] > t[j + 1])
{
tmp = t[j];
t[j] = t[j+1];
t[j+1] = tmp;
s = 1;
}
}
i--;
}
}
</code c>