Tri par insertion/help langage C [Fermé]

Signaler
-
 sabi -
Bonjour,

je suis débutante et doit effectuer un petit programme qui va trier un tableau. Or ma fonction tri ne fonctionne pas j'aimerai dans un premier temps que quelqu'un me corrige et mexplique mes erreurs. dans un second temps jaimerai savoir si je reponds bien a la question. voici l'enoncé: donner l'algorithme de la fonction permettant d'inserer a sa place la (i+1)eme valeur t[i] dans les (i+1)ere positions du tableau t supposé trié entre O et i-1: par comparaisons et permutations la valeur inserée remonte dans le tableau jusqu'a sa place.

dans l'attente de vos reponses, merci.

#include <stdio.h>
#include <stdlib.h>
#define max 11
typedef int Tab[max];

void perm(int *a, int *b)
{
int c=*a;*a=*b;*b=c;
}

void inserer1(Tab t, int n)
{
int i,j,a;
for(i=1;i<=n-1;i++)
{
j=i-1;
while((j>=0) && (t[j]>t[j+1]))
{
//a=t[j];
//t[j]=t[j+1];
//t[j+1]=a;
perm(&t[j],&t[j+1]);
j=j-1;
}
}

}

int main()
{
Tab t={0,2,4,6,8,10,14,16,20,18};
int n,i;
for(i=0;i<max;i++)
{
printf("%d\n",t[i]);
}
inserer1(t,11);
printf("Hello world!\n");
return 0;
}



7 réponses

@Arya Dröttningu: merci davoir repondu.
mais alors c'est quoi le but de la question si on ne me demande pas de trier le tableau?^^ il est question de "tri a insertion" non?
j'ai rebossé le code par rapport a ce que j'ai donc compris!^^

#include<stdio.h>
#include <stdlib.h>
#define n 5
typedef int Tab[n];

/* tri par insertion */
void tri_insertion(Tab t,int i)
{
int j,a;
for(i=1;i<n;i++)
{j=i-1;
while((j>=0) && (t[j]>t[j+1]))
{
a=t[j];
t[j]=t[j+1];
t[j+1]=a;
j--;
}

}
}

/*tri par insertion sequentielle*/
int tri_insertion_seq(Tab t,int i)
{
i
}

int tri_insertion_recursif(Tab t,int i,int k)
{
}

/* affiche le tableau */
void affiche (Tab t, int i)
{
for (i=0;i<n;i++)
printf ("%d ",t[i]);
printf ("\n");
}


int main ()
{
Tab t; int choix, i,r;
for (i=0;i<n;i++)
{
printf("Entrez l'élément %d : ",i+1);
scanf("%d",&t[i]);
}
printf("\ntableau initial : ");
affiche(t,i);
while(choix!=4)
{
printf ("\n********** MENU **********\n");
printf ("1. tri insertion\n");
printf ("2. tri insertion sequentiel\n");
printf ("3. tri insertion recursif\n");
printf("4. quitter");
printf ("\nChoisissez une option : ");
scanf ("%d",&choix);
printf("\n");
switch (choix)
{
case 1:
printf ("Tri insertion: ");
tri_insertion(t,i);
affiche (t,i);
break;
case 2:
printf ("Tri insertion sequentiel: ");
tri_insertion_seq(t,i);
affiche(t,i);
break;
case 3:
printf("Tri insertion recursif: ");
r=tri_insertion_recursif(t,i);
break;
case 4:
printf ("Au revoir!\n");
break;
}
}
return 0;
}

merci d'y preter attention.
alors, d'apres toi, enfaite a la base je suis censé avoir un tableau deja trié, puis rajouter une valeur que je doit placer dans le tableau tout en le gardant trié?? elles sont beaucoup trop complexe leurs questions làà!^^
5
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 57450 internautes nous ont dit merci ce mois-ci

oh mon dieu tant de boulot pour rien si je ne réponds pas a la question!!!! =s
je suis perdu, comment dois-je faire alors?? :/
Messages postés
581
Date d'inscription
mardi 12 janvier 2010
Statut
Membre
Dernière intervention
3 janvier 2019
122
Salut,
J'ai lu la consigne et il ne me semble pas qu'on te demande de trier le tableau....
"tableau t supposé trié" or dans ta fonction le tableau que tu rentres n'est pas tout à fait trié (20 est avant 18)
Messages postés
581
Date d'inscription
mardi 12 janvier 2010
Statut
Membre
Dernière intervention
3 janvier 2019
122
J'ai bien relu ta consigne et, selon moi, oui tu dois avoir un tableau déjà trié.
En fait d'après ce que j'ai compris le programme doit juste insérer la valeur, par exemple :
t=[1;3;4] (tableau de départ)
on veut insérer 2, on le met à la fin : t=[1;3;4;2]
on compare 2 et 4 : 2<4 donc on permute : t=[1;3;2;4]
de même pour 2 et 3 : 2<3 donc t=[1;2;3;4]
on compare 2 et 1 là 2>1 donc la valeur est bien placée, fin du programme

Voilà ce que j'ai compris de la consigne
Messages postés
581
Date d'inscription
mardi 12 janvier 2010
Statut
Membre
Dernière intervention
3 janvier 2019
122
Pour les fonctions de tri, tu n'as besoin que du tableau en paramètre, idem pour la fonction d'affichage.
Exemple :

void tri_insertion(Tab t)
{
	int i,j,a;
	for(i=1;i<n;i++)
	{
		j=i-1;
		while((j>=0) && (t[j]>t[j+1]))
		{
			a=t[j];
			t[j]=t[j+1];
			t[j+1]=a;
			j--;
		}
	}
}





void affiche (Tab t)
{
	int i ;
	for (i=0;i<n;i++)
		printf ("%d ",t[i]);
	printf ("\n");
}
Messages postés
581
Date d'inscription
mardi 12 janvier 2010
Statut
Membre
Dernière intervention
3 janvier 2019
122
J'ai regardé d'un peu plus près et tu n'insères jamais le n dans ta fonction "insere1"
salut sava????
SVP j'ai besoin de vos aides.. chui débutante...
je doit faire l'algorithme:
soit t un tableau d'entiers.On suppose que ce tableau t n'est pas trié.
Ecrire un algorithme, qui retourne l'élément qui apparait le plus souvent dans le tableau t, ainsi que son nombre d'occurences. Si plusieurs éléments différents répondent au probléme, votre algorithme doit en fournir un, quel qu'il soit. Vous ne devez utiliser aucaun tableau que celui sur lequel vous travaillez.
merci d'avance
Messages postés
581
Date d'inscription
mardi 12 janvier 2010
Statut
Membre
Dernière intervention
3 janvier 2019
122
pas la peine de poster ton sujet dans tous les post !
Bonjour!
ok merci beaucoup pour tes précisions. je vais faire mon programme en suivant la consigne comme tu l'a comprise, et je demanderais l'avis de mon professeur.
encore merci pour ton aide bénéfique.
Messages postés
581
Date d'inscription
mardi 12 janvier 2010
Statut
Membre
Dernière intervention
3 janvier 2019
122
Ok si jamais ce n'est pas ça et qu'il fallait faire le tri : désolé ! Mais le plus sûr est effectivement de demander à ton prof.
En tout cas si tu as d'autres problèmes n'hésite pas à revenir ;)
Messages postés
581
Date d'inscription
mardi 12 janvier 2010
Statut
Membre
Dernière intervention
3 janvier 2019
122
Mais non faut pas abandonner ! J'ai trouvé ce site : http://prevert.upmf-grenoble.fr/Prog/Tris/TrisInsertion.html

donc j'ai codé les fonctions et normalement ça fonctionne :


#include<stdio.h>
#include <stdlib.h>
#define n 5
typedef int Tab[n];

void affiche (Tab t)
{
	int i;
	for (i=0;i<n;i++)
	printf ("%d ",t[i]);
	printf ("\n");
}



void insertionR(Tab t, int m, int e) {
   // m nombre d'éléments de t
   // e élément à insérer
   if ((m == 0) || (e >= t[m-1]))
      t[m] = e;
   else {
      t[m] = t[m - 1];
      insertionR(t, m - 1, e);
   }
}



void triInsertionR(Tab t, int m) {
   if (m > 1) {
      triInsertionR(t, m - 1);
      insertionR(t, m - 1, t[m - 1]);
   }
}

int main ()
{
	Tab t={4,2,5,3,1}; 
	printf("\ntableau initial : ");
	affiche(t);
	printf("Tri insertion recursif: ");
	triInsertionR(t,5); //5 taille du tableau à trier
	affiche(t);
	return 0;
} 
>
Messages postés
581
Date d'inscription
mardi 12 janvier 2010
Statut
Membre
Dernière intervention
3 janvier 2019

bonsoir je veut savoir si ce programme est valable pour le tri par insertion croissant merci
wouaho. effectivement ça fonctionne. tu est doué! moi qui ai passé mon temps a coder et a survoler le net a la recherche d'indice, jamais je ne suis retombé sur ce site! :/
je sais pas comment te remercier! =)
c'est vraiment simpa!
Messages postés
581
Date d'inscription
mardi 12 janvier 2010
Statut
Membre
Dernière intervention
3 janvier 2019
122
ben écoute de rien ça m'a permis de revoir un peu le récursif :p
Et puis à part faire un copier coller des fonctions en modifiant les noms j'ai pas fait grand chose :s
oui mais deja, t'etre occupé de mon soucis c'est deja beaucoup, et puis sans ta trouvaille jamais je n'aurais reussi. alors un grand merci a toi, pour l'interet que tu y a porté! ;)