Advertisement
Guest User

Untitled

a guest
Apr 26th, 2019
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.39 KB | None | 0 0
  1. /* a stands for source array;
  2.    b stands for destination array;
  3.    n stands for array size;
  4.    k stands for range of values of integral key, must be a constant;
  5.    d stands for "digit", which is the operation used for extracting the
  6.      integral key from each array item.
  7. */
  8. #define rsort_macro(a,b,n,k,d) { \
  9.     int c[k] = {}; \
  10.  \
  11.     for (int i = 0; i < n; ++i) { \
  12.         ++c[a[i] d]; \
  13.     } \
  14.     for (int i = 1; i < k; ++i) { \
  15.         c[i] += c[i-1]; \
  16.     } \
  17.     for (int i = n-1; i >= 0; --i) { \
  18.         b[--c[a[i] d]] = a[i]; \
  19.     } \
  20. }
  21.  
  22. /* count sort by least significant byte 0..7,
  23.    then by 8..15 and so on...
  24. */
  25. void rsort_int(int *arr, int num)
  26. {
  27.     int *arr_ = malloc(num * sizeof(int));
  28.  
  29.     for (int shr = 0; shr < sizeof(int) * 8; shr += 8) {
  30.         rsort_macro(arr, arr_, num, 0x100, >> shr & 0xff);
  31.         memcpy(arr, arr_, num * sizeof(int));
  32.     }
  33.  
  34.     free(arr_);
  35. }
  36.  
  37. /* dep stand for significant depth,
  38.    which is length of leading substring, taken into account,
  39.    e.g. if dep == 3, "iiia" and "iiib" are treated as equal.
  40. */
  41. void rsort_str(unsigned char **arr, int num, int dep)
  42. {
  43.     unsigned char **arr_ = malloc(num * sizeof(unsigned char *));
  44.  
  45.     while (dep--) {
  46.         rsort_macro(arr, arr_, num, 0x100, [dep]);
  47.         memcpy(arr, arr_, num * sizeof(unsigned char *));
  48.     }
  49.  
  50.     free(arr_);
  51. }
  52.  
  53. /* radix sorting of double precision floating point numbers:
  54.    1. by mantissa, just like integers;
  55.    2. by exponent, just like integers;
  56.    (1.111... * 2^n < 1.000... * 2^(n+1))
  57.    3. when sorted by absolute value, collect in reverse order,
  58.       stack negative ones on the left side
  59.       (descending by absolute value == ascending by signed value),
  60.       and positive ones on the right side
  61.       (descending-descending == ascending).
  62. */
  63. void rsort_dbl(double *arr, int num)
  64. {
  65.     double *arr_ = malloc(num * sizeof(double));
  66.  
  67.     for (int shr = 0; shr < 52; shr += 13) {
  68.         rsort_macro(arr, arr_, num, 0x2000, >> 13 & 0x1fff);
  69.         memcpy(arr, arr_, num * sizeof(double));
  70.     }
  71.     rsort_macro(arr, arr_, num, 0x800, >> 52 & 0x7ff);
  72.     memcpy(arr, arr_, num * sizeof(double));
  73.  
  74.     for (int i = num-1, i_ = 0, _i = num-1; i >= 0; --i) {
  75.         if (arr[i] < 0)
  76.             arr_[i_++] = arr[i];
  77.         else
  78.             arr_[_i--] = arr[i];
  79.     }
  80.     memcpy(arr, arr_, num * sizeof(double));
  81.  
  82.     free(arr_);
  83. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement