private static long qsortPartition(byte *data, long size, QSortComparer comparer, long left, long right) { void *pivot = data + size * left; var i = left - 1; var j = right + 1; for (; ;) { do { ++i; } while (comparer(data + size * i, pivot) < 0); do { --j; } while (comparer(data + size * j, pivot) > 0); if (i >= j) { return(j); } qsortSwap(data, size, i, j); } }
private static void qsortInternal(byte *data, long size, QSortComparer comparer, long left, long right) { if (left < right) { var p = qsortPartition(data, size, comparer, left, right); qsortInternal(data, size, comparer, left, p); qsortInternal(data, size, comparer, p + 1, right); } }
public static void nk_rp_qsort(nk_rp_rect *array, uint len, QSortComparer cmp) { uint right; uint left = (uint)(0); uint *stack = stackalloc uint[64]; uint pos = (uint)(0); uint seed = (uint)(len / 2 * 69069 + 1); for (;;) { for (; (left + 1) < (len); len++) { nk_rp_rect pivot = new nk_rp_rect(); nk_rp_rect tmp = new nk_rp_rect(); if ((pos) == (64)) { len = (uint)(stack[pos = (uint)(0)]); } pivot = (nk_rp_rect)(array[left + seed % (len - left)]); seed = (uint)(seed * 69069 + 1); stack[pos++] = (uint)(len); for (right = (uint)(left - 1);;) { while ((cmp(&array[++right], &pivot)) < (0)) { } while ((cmp(&pivot, &array[--len])) < (0)) { } if ((right) >= (len)) { break; } tmp = (nk_rp_rect)(array[right]); array[right] = (nk_rp_rect)(array[len]); array[len] = (nk_rp_rect)(tmp); } } if ((pos) == (0)) { break; } left = (uint)(len); len = (uint)(stack[--pos]); } }
public static void qsort(void *data, ulong count, ulong size, QSortComparer comparer) { qsortInternal((byte *)data, (long)size, comparer, 0, (long)count - 1); }