// Optimized quick sort algorithm void EDE_Browser::mqsort(char* arr[], int beg, int end, SortType type) { bool k = sort_direction ? false : true; if (end > beg + 1) { char* piv = arr[beg]; int l = beg + 1, r = end; while (l < r) { if (k^sortfn(arr[l],piv,type)) // ^ is XOR l++; else if (l==r-1) // avoid costly swap if they're the same r--; else { swap(--r,l); // Fl_Browser::swap() char *tmp=arr[l]; // update array arr[l]=arr[r]; arr[r]=tmp; } } // avoid costly swap if they're the same if (beg==l-1) l--; else { swap(--l,beg); char*tmp=arr[beg]; // update array arr[beg]=arr[l]; arr[l]=tmp; } // recursion mqsort(arr, beg, l, type); mqsort(arr, r, end, type); } }
list_t *sorted_insert(list_t *list, void *data, int (*sortfn)(const void *, const void *)) { list_t *node = list, *prev = NULL, *new_node; while (node) { if (sortfn(data, (void *) car(node)) <= 0) break; prev = node; node = cdr(node); } new_node = (list_t *) xmalloc(sizeof(list_t)); new_node->next = node; new_node->data = data; if (prev) prev->next = new_node; else list = new_node; return list; }