Advertisement
Guest User

Untitled

a guest
Sep 2nd, 2019
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.52 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <string.h>
  3.  
  4. #define swap(a,b,s) {   \
  5.     char _t[s];         \
  6.     memcpy(_t,  a,  s); \
  7.     memcpy( a,  b,  s); \
  8.     memcpy( b, _t,  s); \
  9. }
  10.  
  11. void *iord(int no, void *arr, size_t num, size_t sz, int (*cmp)(void*,void*))
  12. {
  13.     int part_(void *arr, size_t num, size_t sz, int (*cmp)(void*,void*))
  14.     {
  15.         char (*arr_)[sz] = arr;
  16.         int r = rand() % num, k = num - 1;
  17.         swap(arr_[r], arr_[k], sz);
  18.  
  19.         int i, j;
  20.         for (i = 0, j = 0; j < k; ++j) {
  21.             if (cmp(arr_[j], arr_[k]) < 0) {
  22.                 swap(arr_[i], arr_[j], sz);
  23.                 ++i;
  24.             }
  25.         }
  26.         swap(arr_[i], arr_[k], sz);
  27.  
  28.         return i;
  29.     }
  30.  
  31.     void pair_(void *arr, size_t num, size_t sz, int (*cmp)(void*,void*))
  32.     {
  33.         char (*arr_)[sz] = arr;
  34.  
  35.         for (int i = 0; i+1 < num; i += 2) {
  36.             if (cmp(arr_[i], arr_[i+1]) > 0)
  37.                 swap(arr_[i], arr_[i+1], sz);
  38.         }
  39.     }
  40.  
  41.     char (*arr_)[sz] = arr;
  42.  
  43.     if (no+1 < num/2) {
  44.         pair_(arr_, num, sz, cmp);
  45.         char (*_arr)[sz] = iord(no, arr_, num/2, 2*sz, cmp);
  46.         if (num % 2) {
  47.             ++_arr;
  48.             swap(_arr, arr_[num-1], sz);
  49.         }
  50.         return iord(no, arr_, _arr - arr_, sz, cmp);
  51.     } else {
  52.         int mid = part_(arr_, num, sz, cmp);
  53.         return no == mid++ ? arr_[no]
  54.              : no <  mid   ? iord(no, arr_, mid, sz, cmp)
  55.                            : iord(no-mid, arr_[mid], num-mid, sz, cmp);
  56.     }
  57. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement