Beispiel #1
0
        //////////////////////////////////////////////////////////////////////////////

        private static int SortHashcodeRangeUnique(ulong[] keysIdxs, int start, int end, Obj[] objs, IdxSorter sorter)
        {
            int writeIdx     = start;
            int hashStartIdx = start;

            do
            {
                uint hashcode   = MostSignificant(keysIdxs[hashStartIdx]);
                int  hashEndIdx = hashStartIdx + 1;
                while (hashEndIdx < end && MostSignificant(keysIdxs[hashStartIdx]) == hashcode)
                {
                    hashEndIdx++;
                }

                if (hashEndIdx - hashStartIdx > 1)
                {
                    sorter.Sort(keysIdxs, hashStartIdx, hashEndIdx);

                    int idx = hashStartIdx;
                    do
                    {
                        if (idx != writeIdx)
                        {
                            keysIdxs[writeIdx] = keysIdxs[idx];
                        }
                        writeIdx++;

                        Obj obj = objs[LeastSignificant(keysIdxs[idx++])];
                        while (idx < hashEndIdx && obj.IsEq(objs[LeastSignificant(keysIdxs[idx])]))
                        {
                            idx++;
                        }
                    } while (idx < hashEndIdx);
                }
                else
                {
                    if (hashStartIdx != writeIdx)
                    {
                        keysIdxs[writeIdx] = keysIdxs[hashStartIdx];
                    }
                    writeIdx++;
                }

                hashStartIdx = hashEndIdx;
            } while (hashStartIdx < end);

            return(writeIdx);
        }