Advertisement
Guest User

Untitled

a guest
Oct 24th, 2009
493
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.30 KB | None | 0 0
  1. struct slice
  2. {
  3.     struct node *head;
  4.     size_t size;
  5. };
  6.  
  7. static void merge_down(struct linked_list *list,
  8.     int (*cmp)(const void *, const void *), struct slice *top)
  9. {
  10.     struct node *right = top->head;
  11.     size_t count = top->size;
  12.  
  13.     --top;
  14.  
  15.     struct node *left = top->head;
  16.     top->size += count;
  17.  
  18.     // determine merged list's head
  19.     if(cmp(left->data, right->data) <= 0)
  20.     {
  21.         top->head = left;
  22.         left = left->next;
  23.     }
  24.     else
  25.     {
  26.         top->head = right;
  27.         struct node *node = right;
  28.         right = right->next;
  29.         remove_node(node, list);
  30.         insert_before(node, list, left);
  31.         --count;
  32.     }
  33.  
  34.     while(left != right && count)
  35.     {
  36.         if(cmp(left->data, right->data) <= 0)
  37.             left = left->next;
  38.         else
  39.         {
  40.             struct node *node = right;
  41.             right = right->next;
  42.             remove_node(node, list);
  43.             insert_before(node, list, left);
  44.             --count;
  45.         }
  46.     }
  47. }
  48.  
  49. static void sort(struct linked_list *list,
  50.     int (*cmp)(const void *, const void *))
  51. {
  52.     if(list->size < 2) return;
  53.  
  54.     struct slice stack[32];
  55.     size_t top = -1;
  56.     struct node *current = list->first;
  57.  
  58.     do
  59.     {
  60.         stack[++top] = (struct slice){ current, 1 };
  61.         current = current->next;
  62.         for(; top && stack[top-1].size <= stack[top].size; --top)
  63.             merge_down(list, cmp, stack + top);
  64.     } while(current);
  65.  
  66.     for(; top; --top)
  67.         merge_down(list, cmp, stack + top);
  68. }
  69.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement