Beispiel #1
0
        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);
            }
        }
Beispiel #2
0
        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);
            }
        }
Beispiel #3
0
        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]);
            }
        }
Beispiel #4
0
 public static void qsort(void *data, ulong count, ulong size, QSortComparer comparer)
 {
     qsortInternal((byte *)data, (long)size, comparer, 0, (long)count - 1);
 }