void List::qs_sort(int p, int r, sort_t order) { // Implement quicksort algorithm. The list is sorted in place. // Returns: Nothing. #if defined(DEBUG) dlog->log_entry(DEBUG_MINTRC, "List::qs_sort(%d,%d,%d)", p, r, order); #endif // It would probably make sense to use STL's sort or something, but // that would require a fair amount of rewriting. Array.C does // something similar. if(p < r) { int q = qs_partition(p, r, order); qs_sort(p, q, order); qs_sort(q+1, r, order); } #if defined(DEBUG) dlog->log_exit(DEBUG_MINTRC, "List::qs_sort()"); #endif }
static void qs_sort (void* items, int item_size, int l, int r, compare_proc proc, void* user_data) { if (l < r) { int index = qs_partition(items, item_size, l, r, proc, user_data); qs_sort(items, item_size, l, index - 1, proc, user_data); qs_sort(items, item_size, index + 1, r, proc, user_data); } }
bool List::sort(sort_t order) { // Sort the contents of the list according to <order>. // Returns: True if fully successful, false otherwise. bool ret = false; #if defined(DEBUG) dlog->log_entry(DEBUG_MINTRC, "List::sort(%d)", order); #endif qs_sort(0, size-1, order); // Regenerate commaline xdelete(commaline); for(int i = 0;i < size;i++) { if(i > 0) commaline = xstrcat(commaline, ","); commaline = xstrcat(commaline, items[i]); } ret = true; #if defined(DEBUG) dlog->log_exit(DEBUG_MINTRC, "List::sort = %s", IOTF(ret)); #endif return(ret); }
int quicksort(void* items, int item_size, int ncount, compare_proc proc, void* user_data) { if (items == NULL || proc == NULL || item_size == 0) return ERR_INVALIDARG; if (ncount < 2) return ERR_OK; qs_sort(items, item_size, 0, ncount - 1, proc, user_data); return ERR_OK; }
extern char * qs_sort_copy(const char *url) { if (url == NULL) { errno = EFAULT; return NULL; } char *sorted_url = malloc(strlen(url) + 1); if (sorted_url == NULL) { return NULL; } if (qs_sort(url, sorted_url) != QS_OK) { free(sorted_url); return NULL; } return sorted_url; }