Advertisement
Guest User

Untitled

a guest
Aug 19th, 2016
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.42 KB | None | 0 0
  1. void _radix_sort_lsb(unsigned *begin, unsigned *end, unsigned *begin1, unsigned maxshift)
  2. {
  3.     unsigned *end1 = begin1 + (end - begin);
  4.  
  5.     for (unsigned shift = 0; shift <= maxshift; shift += 8)
  6.     {
  7.         size_t count[0x100] = {};
  8.         for (unsigned *p = begin; p != end; p++)
  9.             count[(*p >> shift) & 0xFF]++;
  10.         unsigned *bucket[0x100], *q = begin1;
  11.         for (int i = 0; i < 0x100; q += count[i++])
  12.             bucket[i] = q;
  13.         for (unsigned *p = begin; p != end; p++)
  14.             *bucket[(*p >> shift) & 0xFF]++ = *p;
  15.         std::swap(begin, begin1);
  16.         std::swap(end, end1);
  17.     }
  18. }
  19.  
  20. void _radix_sort_msb(unsigned *begin, unsigned *end, unsigned *begin1, unsigned shift)
  21. {
  22.     unsigned *end1 = begin1 + (end - begin);
  23.  
  24.     size_t count[0x100] = {};
  25.     for (unsigned *p = begin; p != end; p++)
  26.         count[(*p >> shift) & 0xFF]++;
  27.     unsigned *bucket[0x100], *obucket[0x100], *q = begin1;
  28.     for (int i = 0; i < 0x100; q += count[i++])
  29.         obucket[i] = bucket[i] = q;
  30.     for (unsigned *p = begin; p != end; p++)
  31.         *bucket[(*p >> shift) & 0xFF]++ = *p;
  32.     for (int i = 0; i < 0x100; ++i)
  33.         _radix_sort_lsb(obucket[i], bucket[i], begin + (obucket[i] - begin1), shift - 8);
  34. }
  35.  
  36. void radix_sort(unsigned *begin, unsigned *end)
  37. {
  38.     unsigned *begin1 = new unsigned[end - begin];
  39.     _radix_sort_msb(begin, end, begin1, 24);
  40.     delete[] begin1;
  41. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement