Beispiel #1
0
// 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);
	}
}
Beispiel #2
0
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;
}