sort.cpp 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. /*
  2. * Copyright 2010-2017 Branimir Karadzic. All rights reserved.
  3. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
  4. */
  5. #include <bx/sort.h>
  6. namespace bx
  7. {
  8. static void quickSortR(void* _pivot, void* _data, uint32_t _num, uint32_t _stride, const ComparisonFn _fn)
  9. {
  10. if (2 > _num)
  11. {
  12. return;
  13. }
  14. memCopy(_pivot, _data, _stride);
  15. uint8_t* data = (uint8_t*)_data;
  16. uint32_t ll = 0;
  17. uint32_t gg = 1;
  18. for (uint32_t ii = 1; ii < _num;)
  19. {
  20. int32_t result = _fn(&data[ii*_stride], _pivot);
  21. if (0 > result)
  22. {
  23. xchg(&data[ll*_stride], &data[ii*_stride], _stride);
  24. ++ll;
  25. }
  26. else if (0 == result)
  27. {
  28. xchg(&data[gg*_stride], &data[ii*_stride], _stride);
  29. ++gg;
  30. ++ii;
  31. }
  32. else
  33. {
  34. ++ii;
  35. }
  36. }
  37. quickSortR(_pivot, &data[0 ], ll, _stride, _fn);
  38. quickSortR(_pivot, &data[gg*_stride], _num-gg, _stride, _fn);
  39. }
  40. void quickSort(void* _data, uint32_t _num, uint32_t _stride, const ComparisonFn _fn)
  41. {
  42. uint8_t* pivot = (uint8_t*)alloca(_stride);
  43. quickSortR(pivot, _data, _num, _stride, _fn);
  44. }
  45. } // namespace bx