コード例 #1
0
        /// <summary>
        /// 排序取Top N
        /// </summary>
        /// <param name="values">待排序数组</param>
        /// <param name="count">排序数据数量</param>
        /// <returns>排序后的数据</returns>
        private static LeftArray </*Type[0]*/ ulong /*Type[0]*/> getTop/*Compare[0]*//*Compare[0]*/ (/*Type[0]*/ ulong /*Type[0]*/[] values, int count)
        {
            uint sqrtMod;
            int  length = Math.Min(Math.Max(count << 2, count + (int)AutoCSer.Extension.Number.sqrt((uint)values.Length, out sqrtMod)), values.Length);

            /*Type[0]*/
            ulong /*Type[0]*/[] newValues = new /*Type[0]*/ ulong /*Type[0]*/[length];
            fixed(/*Type[0]*/ ulong /*Type[0]*/ *newValueFixed = newValues, valueFixed = values)
            {
                /*Type[0]*/
                ulong /*Type[0]*/ *readIndex = valueFixed + values.Length - length;

                Buffer.BlockCopy(values, (int)((byte *)readIndex - (byte *)valueFixed), newValues, 0, length * sizeof(/*Type[0]*/ ulong /*Type[0]*/));
                //unsafer.memory.Copy(readIndex, newValueFixed, length * sizeof(/*Type[0]*/ulong/*Type[0]*/));
                /*Type[0]*/
                ulong /*Type[0]*/ *writeStat = newValueFixed + count, writeEnd = newValueFixed + --length, writeIndex = writeStat;

                FixedArrayQuickRangeSort./*Type[1]*/ ULongRangeSorter /*Type[1]*//*Compare[0]*//*Compare[0]*/ sort = new FixedArrayQuickRangeSort./*Type[1]*/ ULongRangeSorter /*Type[1]*//*Compare[0]*//*Compare[0]*/ {
                    SkipCount = writeStat - 1, GetEndIndex = writeStat - 1
                };
                sort.Sort(newValueFixed, writeEnd);
                for (/*Type[0]*/ ulong /*Type[0]*/ maxValue = *sort.SkipCount; readIndex != valueFixed;)
                {
                    if (*--readIndex /*Compare[1]*/ < /*Compare[1]*/ maxValue)
                    {
                        *writeIndex = *readIndex;
                        if (writeIndex == writeEnd)
                        {
                            sort.Sort(newValueFixed, writeEnd);
                            writeIndex = writeStat;
                            maxValue   = *sort.SkipCount;
                        }
                        else
                        {
                            ++writeIndex;
                        }
                    }
                }
                if (writeIndex != writeStat)
                {
                    sort.Sort(newValueFixed, --writeIndex);
                }
            }

            return(new LeftArray </*Type[0]*/ ulong /*Type[0]*/> {
                Array = newValues, Length = count
            });
        }
コード例 #2
0
        /// <summary>
        /// 排序去除Top N
        /// </summary>
        /// <param name="values">待排序数组</param>
        /// <param name="count">排序数据数量</param>
        /// <returns>排序后的数据</returns>
        private static /*Type[0]*/ ulong /*Type[0]*/[] getRemoveTop/*Compare[0]*//*Compare[0]*/ (/*Type[0]*/ ulong /*Type[0]*/[] values, int count)
        {
            /*Type[0]*/
            ulong /*Type[0]*/[] newValues = new /*Type[0]*/ ulong /*Type[0]*/[count];
            count = values.Length - count;
            uint sqrtMod;
            int  length = Math.Min(Math.Max(count << 2, count + (int)AutoCSer.Extension.Number.sqrt((uint)values.Length, out sqrtMod)), values.Length);

            /*Type[0]*/
            ulong /*Type[0]*/[] removeValues = new /*Type[0]*/ ulong /*Type[0]*/[length];
            fixed(/*Type[0]*/ ulong /*Type[0]*/ *newValueFixed = newValues, removeFixed = removeValues, valueFixed = values)
            {
                int copyCount = length - count, copyLength = copyCount * sizeof(/*Type[0]*/ ulong /*Type[0]*/);
                /*Type[0]*/
                ulong /*Type[0]*/ *readIndex = valueFixed + values.Length - length, removeStart = removeFixed + copyCount;

                Buffer.BlockCopy(values, (int)((byte *)readIndex - (byte *)valueFixed), removeValues, 0, length * sizeof(/*Type[0]*/ ulong /*Type[0]*/));
                //unsafer.memory.Copy(readIndex, removeFixed, length * sizeof(/*Type[0]*/ulong/*Type[0]*/));
                /*Type[0]*/
                ulong /*Type[0]*/ *removeEnd = removeFixed + --length, removeIndex = removeStart, writeIndex = newValueFixed + copyCount;

                FixedArrayQuickRangeSort./*Type[1]*/ ULongRangeSorter /*Type[1]*//*Compare[0]*//*Compare[0]*/ sort = new FixedArrayQuickRangeSort./*Type[1]*/ ULongRangeSorter /*Type[1]*//*Compare[0]*//*Compare[0]*/ {
                    SkipCount = removeStart, GetEndIndex = removeStart
                };
                sort.Sort(removeFixed, removeEnd);
                Buffer.BlockCopy(removeValues, 0, newValues, 0, copyLength);
                //unsafer.memory.Copy(removeFixed, newValueFixed, copyLength);
                for (/*Type[0]*/ ulong /*Type[0]*/ maxValue = *removeStart; readIndex != valueFixed;)
                {
                    if (*--readIndex /*Compare[2]*/ <= /*Compare[2]*/ maxValue)
                    {
                        *writeIndex++ = *readIndex;
                    }
                    else
                    {
                        *--removeIndex = *readIndex;
                        if (removeIndex == removeFixed)
                        {
                            sort.Sort(removeFixed, removeEnd);
                            removeIndex = removeStart;
                            maxValue    = *removeStart;
                            Buffer.BlockCopy(removeValues, 0, newValues, (int)((byte *)writeIndex - (byte *)newValueFixed), copyLength);
                            //unsafer.memory.Copy(removeFixed, writeIndex, copyLength);
                            writeIndex += copyCount;
                        }
                    }
                }
                if (removeIndex != removeStart)
                {
                    sort.Sort(removeIndex, removeEnd);
                    Buffer.BlockCopy(removeValues, (int)((byte *)removeIndex - (byte *)removeFixed), newValues, (int)((byte *)writeIndex - (byte *)newValueFixed), (int)((byte *)removeStart - (byte *)removeIndex));
                    //unsafer.memory.Copy(removeIndex, writeIndex, (int)(removeStart - removeIndex) * sizeof(/*Type[0]*/ulong/*Type[0]*/));
                }
            }

            return(newValues);
        }