| 8 | namespace bx |
| 9 | { |
| 10 | static void quickSortR(void* _pivot, void* _data, uint32_t _num, uint32_t _stride, const ComparisonFn _fn) |
| 11 | { |
| 12 | if (2 > _num) |
| 13 | { |
| 14 | return; |
| 15 | } |
| 16 | |
| 17 | memCopy(_pivot, _data, _stride); |
| 18 | |
| 19 | uint8_t* data = (uint8_t*)_data; |
| 20 | |
| 21 | uint32_t ll = 0; |
| 22 | uint32_t gg = 1; |
| 23 | |
| 24 | for (uint32_t ii = 1; ii < _num;) |
| 25 | { |
| 26 | int32_t result = _fn(&data[ii*_stride], _pivot); |
| 27 | if (0 > result) |
| 28 | { |
| 29 | swap(&data[ll*_stride], &data[ii*_stride], _stride); |
| 30 | ++ll; |
| 31 | } |
| 32 | else if (0 == result) |
| 33 | { |
| 34 | swap(&data[gg*_stride], &data[ii*_stride], _stride); |
| 35 | ++gg; |
| 36 | ++ii; |
| 37 | } |
| 38 | else |
| 39 | { |
| 40 | ++ii; |
| 41 | } |
| 42 | } |
| 43 | |
| 44 | quickSortR(_pivot, &data[0 ], ll, _stride, _fn); |
| 45 | quickSortR(_pivot, &data[gg*_stride], _num-gg, _stride, _fn); |
| 46 | } |
| 47 | |
| 48 | void quickSort(void* _data, uint32_t _num, uint32_t _stride, const ComparisonFn _fn) |
| 49 | { |