Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2458 connectés 

  FORUM HardWare.fr
  Programmation
  C

  tri fusion en C

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

tri fusion en C

n°563964
Chrysaor
Posté le 11-11-2003 à 14:34:50  profilanswer
 

je voudrais le code d'un tri fusion il parait que c'est la méthode la plus utilisée pour trier un tableau....
g fait le tri par séléection c'était pas dur mais le tri fusion serait le plus rapide
on découpe un tableau en deux on tri les deux morceaux et on les fusionne
pour les grands tableaux on doit decouper et fusionner des morceaux de 2 ou 3 elements


---------------
Ben mon PC wine bien mais... on en veux tjs plus!!!
mood
Publicité
Posté le 11-11-2003 à 14:34:50  profilanswer
 

n°563965
chrisbk
-
Posté le 11-11-2003 à 14:35:44  profilanswer
 

CHRYSAOR a écrit :

je voudrais le code d'un tri fusion il parait que c'est la méthode la plus utilisée pour trier un tableau....


 
et avec ca ?

n°563968
kadreg
profil: Utilisateur
Posté le 11-11-2003 à 14:38:59  profilanswer
 

Code :
  1. (* LE TRI PAR FUSION *)
  2. (* ci dessous la fusion de deux files *)
  3. let rec fusion (a,b) = match (a,b) with
  4.     | ([],_) -> b
  5.     | (_,[]) -> a
  6.     | (t1::r1,t2::r2)-> if t1<t2
  7.                         then t1::fusion (r1,b)
  8.                         else t2::fusion (a,r2)
  9.    ;;
  10. (* transforme une liste en liste de listes *)
  11. let listemoica t = [t];;
  12. let listeliste l=map listemoica l ;;
  13. (* trifusion avec les listes de listes *)
  14. (* l'ensemble des deux fonction trifusionll & boulot fonctionne, mais il
  15. doit y avoir moyen de faire une seule fonction, et d'avoir une liste de
  16. motifs plus facile à comprendre *)
  17. let rec trifusionll = function
  18.      |a::b::c -> fusion (a,b) :: trifusionll c
  19.      |a::_   -> [a]
  20.      |_      -> []
  21. ;;
  22. let rec boulot = function
  23.    |[]->[[]]
  24.    |t::r as ll-> if r=[]
  25.                  then [t]
  26.                  else boulot (trifusionll ll)
  27. ;;
  28. (* la commande finale *)
  29. let trifusion m = hd (boulot (listeliste m));;
  30. (* des listes toutes prêtes pour faire des tests *)
  31. let pairs=  [0;2;4;6;8;10;12;14];;
  32. let impairs=[1;3;5;7;9;11;13;15];;
  33. let petitpair=[0;2;4];;


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
n°563973
drasche
Posté le 11-11-2003 à 14:40:57  profilanswer
 

chrisbk a écrit :

et avec ca ?


100 balles et un mars [:spamafote]
 
eh oh, une recherche dans google et on trouve des bibles entières sur les algorithmes de tri, faut pas pousser :/


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
n°563974
chrisbk
-
Posté le 11-11-2003 à 14:41:04  profilanswer
 

c'est quel include pour que le compilo plante pas sur "let" ? [:icon9]

n°563989
nraynaud
lol
Posté le 11-11-2003 à 14:51:37  profilanswer
 

il est bizarre con code kad, mais je sais pas pourquoi.

Code :
  1. let rec trifusionll = function
  2.        |a::b::c -> fusion (a,b) :: trifusionll c


ça c'est pas terminal.
 

Code :
  1. let rec fusion (a,b) = match (a,b) with
  2.       | ([],_) -> b
  3.       | (_,[]) -> a
  4.       | (t1::r1,t2::r2)-> if t1<t2
  5.                             then t1::fusion (r1,b)
  6.                           else t2::fusion (a,r2)


se réécrit en  

Code :
  1. let rec fusion = function
  2.       | ([],x) -> x
  3.       | (x,[]) -> x
  4.       | ((t1::r1) as a,(t2::r2) as b)-> if t1<t2
  5.                             then t1::fusion (r1,b)
  6.                           else t2::fusion (a,r2)

bien entendu, c'est pas terminal non plus.
 

Code :
  1. let listemoica t = [t];;
  2. let listeliste l=map listemoica l ;;


se réécrit en

Code :
  1. let listeliste l = map (fun x -> [x]) l ;;

(et c'est terminal)
 
on peut tout faire en une seule fonction, comme tu le dis (en gardant ton code, corrigé un peu) :

Code :
  1. let trifusion m =
  2.   let listeliste l = List.map (fun x -> [x]) l in
  3.   let rec boulot =
  4.     let rec trifusionll =
  5.       let rec fusion = function
  6.         | ([],x) -> x
  7.         | (x,[]) -> x
  8.         | (((t1::r1) as a),((t2::r2) as b))-> if t1<t2
  9.                             then t1::fusion (r1,b)
  10.                           else t2::fusion (a,r2) in
  11.       function
  12.         |a::b::c -> fusion (a,b) :: trifusionll c
  13.         |a::_   -> [a]
  14.         |_      -> [] in
  15.     function
  16.       |[]->[[]]
  17.       |t::r as ll-> if r=[]
  18.                 then [t]
  19.                 else boulot (trifusionll ll)
  20.   in
  21.   List.hd (boulot (listeliste m));;


Message édité par nraynaud le 11-11-2003 à 15:04:15

---------------
trainoo.com, c'est fini
n°563992
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 11-11-2003 à 14:55:24  profilanswer
 

[:rofl]
les salauds


---------------
J'ai un string dans l'array (Paris Hilton)
n°564145
Ace17
Posté le 11-11-2003 à 18:27:39  profilanswer
 

Hoooo du Caml!!!  
J'en connais un qui va s'amuser....
 
CHRYSAOR mettons les choses au point... On aura plaisir a te filer des conseils, des astuces, t'aider a résoudre des problemes, répondre a tes questions, mais faire le boulot a ta place... faudrait voir a pas nous confondre avec une équipe de programmeurs bénévoles! Pour qui nous prends-tu?

n°564245
Chrysaor
Posté le 11-11-2003 à 20:33:12  profilanswer
 

désolé je pensais pas ofusquer(lol) tant de monde moi!!!
non en fait c que je vois bien l'algo je m'en sors tjs bien avec les algos mais je peine avec le code et la syntaxe...
manque de temps et de pratique cjuste de la "petite" programmation que je fais c pas super fort.
est ce qu'il y en a qui connaisse les cartes matlog?? je dois travailler avec une BL2000 et le "dynamic c" a priori ca ressemble a du c meme enormement mais avec de petits changements.
je voudrais deux ou trois conseils et savoir si quelqu'un sait ou je peux trouve le logiciel pour bosser chez moi je le trouve pas...
voir meme pour un qui ait l'adsl m'envoyer l'iso du cd que je me debrouille
lol je crois que je suis en train de demander 1000000? et une montagne de mars
excusez moii!!!


Message édité par Chrysaor le 11-11-2003 à 20:33:32

---------------
Ben mon PC wine bien mais... on en veux tjs plus!!!
n°564996
Ace17
Posté le 12-11-2003 à 15:48:45  profilanswer
 

Content que tu l'aies bien pris :)
Demande tous les conseils que tu veux; C'est juste que la paresse est tres, tres mal vue sur ce forum... alors tu penses bien que demander qu'on te fasse ton boulot allait déclencher de telles réactions... :)
Concernant les cartes matlog, désolé, je ne connais pas du tout mais d'apres ce que j'ai vu sur http://www.e-matlog.com/ProdServ/ZW/DC/Docs/M0058f.pdf ca a l'air d'etre effectivement tres proche du C, et dans ce cas je te renvoie a la section bibliolinks concernant ce langage.
Quant au logiciel dont tu parles, cherche "dynamic c" dans google, tout simplement...

mood
Publicité
Posté le 12-11-2003 à 15:48:45  profilanswer
 

n°572003
xWillow
Posté le 20-11-2003 à 21:04:59  profilanswer
 

CHRYSAOR a écrit :

 
on découpe un tableau en deux on tri les deux morceaux et on les fusionne


Je voie pas de quelle tri tu parles, j'en connais deux qui utilisent cette methode, et apparement le plus utilisé est non pas le tri par fusion mais le tri rapide.


Message édité par xWillow le 20-11-2003 à 21:05:34
n°572027
Kristoph
Posté le 20-11-2003 à 22:03:30  profilanswer
 

xWillow a écrit :


Je voie pas de quelle tri tu parles, j'en connais deux qui utilisent cette methode, et apparement le plus utilisé est non pas le tri par fusion mais le tri rapide.


 
La difference entre le tri fusion et le tri rapide c'est que :
- dans le tri rapide, on sépare les elements en 2 parties séparées par un pivot : tous les elements plus petits que le pivot à gauche et les autres à droite. On tri chaque sous partie et on met le resultat bout à bout.
- dans le tri fusion, on sépare au milieu sans se poser de questions, on tri les 2 sous parties et on les rassemble intelligement en fusionnant les deux parties en profitant du fait qu'elles sont déjà triées justement.

n°572032
Ace17
Posté le 20-11-2003 à 22:10:03  profilanswer
 

Kristoph a écrit :


- dans le tri fusion, on sépare au milieu sans se poser de questions, on tri les 2 sous parties et on les rassemble intelligement en fusionnant les deux parties en profitant du fait qu'elles sont déjà triées justement.


 
Tu oublies de dire le principal! On trie récursivement les 2 sous parties... C'est a dire en utilisant un tri fusion justement! Sinon ca ne sert a rien...
 
Tri fusion :
  ma liste n'a qu'un élément?  
  oui -> renvoyer la liste
  non -> la couper en deux. Faire un tri fusion sur les deux morceaux, fusionner les deux résultats.

n°572049
Kristoph
Posté le 20-11-2003 à 22:28:00  profilanswer
 

Ace17 a écrit :


 
Tu oublies de dire le principal! On trie récursivement les 2 sous parties... C'est a dire en utilisant un tri fusion justement! Sinon ca ne sert a rien...
 
Tri fusion :
  ma liste n'a qu'un élément?  
  oui -> renvoyer la liste
  non -> la couper en deux. Faire un tri fusion sur les deux morceaux, fusionner les deux résultats.


 
Ah non, quand je disais qu'on trie les sous partie, j'entends par la qu'on doit faire un "tri rapide". De même lors du "tri rapide", il faut trier les sous parties avec un "tri fusion". Sauf si le pgcd du nombre d'elements des 2 parties est 54 bien sur. À ce moment il faut faire un "tri a bulle"
 
:D

n°572145
Ace17
Posté le 21-11-2003 à 06:49:05  profilanswer
 

Kristoph a écrit :


 
Ah non, quand je disais qu'on trie les sous partie, j'entends par la qu'on doit faire un "tri rapide". De même lors du "tri rapide", il faut trier les sous parties avec un "tri fusion". Sauf si le pgcd du nombre d'elements des 2 parties est 54 bien sur. À ce moment il faut faire un "tri a bulle"
 
:D
 


 
 :lol:  
Non mais je voulais juste insister la dessus; Parce que faut faire gaffe tu sais :D j'en ai connu qui, pour faire un tri fusion, coupaient leur listent en deux, triaient chaque sous partie par un tri par selection, et ensuite concatenaient les deux listes!!!   :sarcastic:

n°573912
blazkowicz
Posté le 23-11-2003 à 16:13:07  profilanswer
 

moi j'ai fait ça pour le tri fusion :D
 
 


 
let coupe l =
 let rec aux l l2= match l with
 |[]->l2,[]
 |[x]->l2@[x],[]
 |(h::h2::t)-> if h2<h then (l2@[h],h2::t)
                else aux (h2::t) (l2@[h])
in aux l [];;
 
 
let rec decoupage l=match l with
 |[]->[[]]
 |[x]->[[x]]
 |l-> let (x,y)= coupe l in x::decoupage y;;
 
let rec fusion (l1,l2) = match (l1,l2) with
 |l1,[]->l1
 |[],l2->l2
 |(h1::t1),(h2::t2)->if h1<=h2 then h1::fusion (t1,(h2::t2))
                     else h2::fusion (t2,(h1::t1));;
 
let tri_fusion l = let d=decoupage l
  in let rec aux ll=match ll with
    |[[]]->[]
    |[[x]]->[x]
    |[a;b]->fusion (a,b)
    |(h::h2::t)->aux((fusion (h,h2))::t)
  in aux d;;
 


 
 
et pour avoir des listes à tester :
 


let l1=[5;3;2;7;6;9];;
let l2=[9;8;2;3;4;7;1;3;2];;
let l3=[8;10;17;2;1;12;7;6;9];;
 
 
let rec genere x len = match len with
 |0->[]
 |len->(random__int x)::genere x (len-1);;


Message édité par blazkowicz le 23-11-2003 à 16:24:59

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  tri fusion en C

 

Sujets relatifs
fusion word avec le symbole euros[PHP] Classes et Héritages ou Fusion ?
[XSL - XML] fusion colonne et nombre a virguleune fusion silencieuse
Générer un fichier Excel grace au Cold Fusion ?Fusion de 2 listes chainees
Colf Fusiontrie par fusion
[Page Web] Fusion de pages en une seule.Récupérer l'adresse IP du client [Cold Fusion]
Plus de sujets relatifs à : tri fusion en C


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)