C tri par fusion

C tri par fusion - C - Programmation

Marsh Posté le 17-08-2015 à 12:44:49    

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.   }


Reply

Marsh Posté le 17-08-2015 à 12:44:49   

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed