int qs_partition(void *array, int *indexes, int start, int end, int pivot) { int j = start, i; qs_swap(array, indexes, pivot, end); for (i = start ; i < end ; i++) { if (indexes[i] <= indexes[end]) { qs_swap(array, indexes, i, j); j++; } } qs_swap(array, indexes, end, j); return j; }
static int qs_partition (void* items, int item_size, int l, int r, compare_proc proc, void* user_data) { char* start = (char*)items; char* value = (start + r*item_size); char* ptr = (start + l*item_size); char* swap_ptr = ptr; while (ptr < value) { if (proc(ptr, value, user_data) < 0) { qs_swap(ptr, swap_ptr, item_size); swap_ptr += item_size; } ptr += item_size; } qs_swap(value, swap_ptr, item_size); return (swap_ptr - start)/item_size; }