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

  FORUM HardWare.fr
  Programmation
  C

  C tri par fusion

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

C tri par fusion

n°2264492
zekhninisa​ber
Posté le 17-08-2015 à 12:44:49  profilanswer
 

Bonjour à tous,
 
j'ai sous la main cette fonction de tri par fusion que je ne comprend pas. Quelqu'un saurait-il m'expliquer grosso modo ligne par ligne ce qu'elle fait ?
Aussi y'a-t-il possibilité de l'écrire de manière plus simple que ça ?
Merci
 

Code :
  1. void TriFusion(typeListItem * list) {
  2.     // Trivial case.
  3.     if (!list || !list->NextItem)
  4.       return list;
  5.     typeListItem *right = list,
  6.           *temp  = list,
  7.           *last  = list,
  8.           *result = 0,
  9.           *next   = 0,
  10.           *tail   = 0;
  11.     // Find halfway through the list (by running two pointers, one at twice the speed of the other).
  12.     while (temp && temp->NextItem) {
  13.       last = right;
  14.       right = right->NextItem;
  15.       temp = temp->next->NextItem;
  16.     }
  17.     // Break the list in two. (prev pointers are broken here, but we fix later)
  18.     last->NextItem = 0;
  19.     // Recurse on the two smaller lists:
  20.     list = TriFusion(list);
  21.     right = TriFusion(right);
  22.     // Merge:
  23.     while (list || right) {
  24.       // Take from empty lists, or compare:
  25.       if (!right) {
  26.         next = list;
  27.         list = list->NextItem;
  28.       } else if (!list) {
  29.         next = right;
  30.         right = right->NextItem;
  31.       } else if ( ( SortKey == SortNbr ?
  32.                 (*(float *) ((char *)AuxItem+ListOffset[SortKey]) - *(float *) ((char *)CurItem+ListOffset[SortKey])) :
  33.                 strcmp ( (char *)AuxItem+ListOffset[SortKey], (char *)CurItem+ListOffset[SortKey] ) ) < 0  ) {
  34.         // if (AuxItem < CurItem) : SWAP
  35.         next = list;
  36.         list = list->NextItem;
  37.       } else {
  38.         next = right;
  39.         right = right->NextItem;
  40.       }
  41.       if (!result) {
  42.         result=next;
  43.       } else {
  44.         tail->NextItem=next;
  45.       }
  46.       tail = next;
  47.     }
  48.     return result;
  49.   }


mood
Publicité
Posté le 17-08-2015 à 12:44:49  profilanswer
 


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

  C tri par fusion

 

Sujets relatifs
Besoin d'aide en C[C#] Problème récup fabrique de la classe COM
Mais où sont donc passées les Windows Form en C++?QCM en programmation C
Lancer une Video en C++[C#] Utilisation DataSet
[C++]Interdiction de caractèreC# et Crystal Report
Tri_fusion en C qui ne fonctionne pastri fusion en C
Plus de sujets relatifs à : C tri par fusion


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR