sort.cpp 1.1 KB

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