Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void __qswap(void *a, int offseta, void *b, int offsetb, size_t size) {
- void *tmp = malloc(size);
- memcpy(tmp, (char*)a + (offseta * size), size);
- memcpy((char*)a + (offseta * size), (char*)b + (offsetb * size), size);
- memcpy((char*)b + (offsetb * size), tmp, size);
- free(tmp);
- }
- void qs(void *arr, unsigned n, size_t size, int (*comp)(const void*, const void*)) {
- if (n <= 1)
- return;
- int pivot = (n - 1) >> 1;
- int left = 0, right = n - 1;
- void *a = malloc(size), *b = malloc(size);
- while (left < right) {
- memcpy(a, (char*)arr + (left * size), size);
- memcpy(b, (char*)arr + (pivot * size), size);
- while (left < pivot && comp(a, b) < 1) { // while (left < pivot && arr[left] <= arr[pivot])
- ++ left;
- memcpy(a, (char*)arr + (left * size), size);
- }
- memcpy(a, (char*)arr + (right * size), size);
- memcpy(b, (char*)arr + (pivot * size), size);
- while (right > pivot && comp(a, b) > -1) { // while (right > pivot && arr[right] >= arr[pivot])
- -- right;
- memcpy(a, (char*)arr + (right * size), size);
- }
- memcpy(a, (char*)arr + (left * size), size);
- memcpy(b, (char*)arr + (right * size), size);
- if (comp(a, b) == 1) { // if (arr[left] > arr[right])
- if (left == pivot) {
- __qswap(arr, left, arr, right, size);
- pivot = right;
- }
- else if (right == pivot) {
- __qswap(arr, right, arr, left, size);
- pivot = left;
- }
- else {
- __qswap(arr, left, arr, right, size);
- }
- }
- memcpy(a, (char*)arr + (left * size), size);
- memcpy(b, (char*)arr + (right * size), size);
- if (comp(a, b) == 0) // if (arr[left] == arr[right])
- break;
- }
- if (n == 2) {
- memcpy(a, (char*)arr + (0 * size), size);
- memcpy(b, (char*)arr + (1 * size), size);
- if (comp(a, b) == 1) // if (arr[0] > arr[1])
- __qswap(arr, 0, arr, 1, size);
- free(a);
- free(b);
- return;
- }
- free(a);
- free(b);
- qs(arr, pivot, size, comp);
- qs((char*)arr + (pivot * size), n - pivot, size, comp);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement