List_PersonPtr_Iterator node_sort(List_PersonPtr *list, List_PersonPtr_Iterator begin, List_PersonPtr_Iterator end) { List_PersonPtr_Iterator res1; List_PersonPtr_Iterator res2; if(begin.node == end.node) { begin.node->next = NULL; return begin; } else { List_PersonPtr_Iterator slow = begin; List_PersonPtr_Iterator fast = begin; fast.inc(&fast); while(!List_PersonPtr_Iterator_equal(fast,end)) { fast.inc(&fast); if(!List_PersonPtr_Iterator_equal(fast,end)) { fast.inc(&fast); slow.inc(&slow); } } List_PersonPtr_Iterator slow_next = slow; slow_next.inc(&slow_next); slow.node->next = NULL; res1 = node_sort(list, begin, slow); res2 = node_sort(list, slow_next, end); } return SortedMerge(list, res1, res2); }
void sort(List_PersonPtr* list) { List_PersonPtr_Iterator end = list->end(list); end.dec(&end); List_PersonPtr_Iterator head = node_sort(list, list->begin(list), end); list->head.next = head.node; reinsertPrevPointers(list); }
static void fini_galaxy_prep(struct galaxy *g) { g->N_num = node_sort(g->N, 0, 1, g->S, 0, g->S_num, 0); }