Example #1
0
        /// <summary>
        /// 排序去除Top N
        /// </summary>
        /// <typeparam name="valueType">数据类型</typeparam>
        /// <param name="values">待排序数组</param>
        /// <param name="getKey">排序键值获取器</param>
        /// <param name="count">排序数据数量</param>
        /// <param name="newValues">目标数据数组</param>
        /// <param name="length">排序缓存区尺寸</param>
        /// <param name="removeFixed">索引位置</param>
        private static void removeTop/*Compare[0]*//*Compare[0]*/ <valueType>(valueType[] values, Func <valueType, /*Type[0]*/ ulong /*Type[0]*/> getKey, int count, valueType[] newValues, int length, /*Type[2]*/ ULongSortIndex /*Type[2]*/ *removeFixed)
        {
            int index = 0, writeIndex = 0;
            /*Type[2]*/
            ULongSortIndex /*Type[2]*/ *removeEnd = removeFixed;

            while (index != length)
            {
                (*removeEnd++).Set(getKey(values[index]), index++);
            }
            /*Type[2]*/
            ULongSortIndex /*Type[2]*/ *removeStart = removeFixed + (count = length - count), removeIndex = removeFixed;

            FixedArrayQuickRangeSort./*Type[3]*/ ULongRangeIndexSorter /*Type[3]*//*Compare[0]*//*Compare[0]*/ sort = new FixedArrayQuickRangeSort./*Type[3]*/ ULongRangeIndexSorter /*Type[3]*//*Compare[0]*//*Compare[0]*/ {
                SkipCount = removeStart, GetEndIndex = removeStart
            };
            sort.Sort(removeFixed, --removeEnd);
            while (writeIndex != count)
            {
                newValues[writeIndex++] = values[(*removeIndex++).Index];
            }
            for (/*Type[0]*/ ulong /*Type[0]*/ maxValue = (*removeStart).Value; index != values.Length; ++index)
            {
                /*Type[0]*/
                ulong /*Type[0]*/ value = getKey(values[index]);
                if (value /*Compare[2]*/ <= /*Compare[2]*/ maxValue)
                {
                    newValues[writeIndex++] = values[index];
                }
                else
                {
                    (*--removeIndex).Set(value, index);
                    if (removeIndex == removeFixed)
                    {
                        sort.Sort(removeFixed, removeEnd);
                        for (removeIndex = removeFixed; removeIndex != removeStart; newValues[writeIndex++] = values[(*removeIndex++).Index])
                        {
                            ;
                        }
                        maxValue = (*removeStart).Value;
                    }
                }
            }
            if (removeIndex != removeStart)
            {
                sort.Sort(removeIndex, removeEnd);
                while (removeIndex != removeStart)
                {
                    newValues[writeIndex++] = values[(*removeIndex++).Index];
                }
            }
        }
Example #2
0
        /// <summary>
        /// 排序取Top N
        /// </summary>
        /// <typeparam name="valueType">数据类型</typeparam>
        /// <param name="values">待排序数组</param>
        /// <param name="getKey">排序键值获取器</param>
        /// <param name="count">排序数据数量</param>
        /// <param name="length">排序缓存区尺寸</param>
        /// <param name="indexFixed">索引位置</param>
        /// <returns>排序后的数据</returns>
        private static valueType[] getTop/*Compare[0]*//*Compare[0]*/ <valueType>(valueType[] values, Func <valueType, /*Type[0]*/ ulong /*Type[0]*/> getKey, int count, int length, /*Type[2]*/ ULongSortIndex /*Type[2]*/ *indexFixed)
        {
            /*Type[2]*/
            ULongSortIndex /*Type[2]*/ *writeEnd = indexFixed;
            int index = 0;

            while (index != length)
            {
                (*writeEnd++).Set(getKey(values[index]), index++);
            }
            /*Type[2]*/
            ULongSortIndex /*Type[2]*/ *writeStat = indexFixed + count, writeIndex = writeStat;

            FixedArrayQuickRangeSort./*Type[3]*/ ULongRangeIndexSorter /*Type[3]*//*Compare[0]*//*Compare[0]*/ sort = new FixedArrayQuickRangeSort./*Type[3]*/ ULongRangeIndexSorter /*Type[3]*//*Compare[0]*//*Compare[0]*/ {
                SkipCount = writeStat - 1, GetEndIndex = writeStat - 1
            };
            sort.Sort(indexFixed, --writeEnd);
            for (/*Type[0]*/ ulong /*Type[0]*/ maxValue = (*sort.SkipCount).Value; index != values.Length; ++index)
            {
                /*Type[0]*/
                ulong /*Type[0]*/ value = getKey(values[index]);
                if (value /*Compare[1]*/ < /*Compare[1]*/ maxValue)
                {
                    (*writeIndex).Set(value, index);
                    if (writeIndex == writeEnd)
                    {
                        sort.Sort(indexFixed, writeEnd);
                        writeIndex = writeStat;
                        maxValue   = (*sort.SkipCount).Value;
                    }
                    else
                    {
                        ++writeIndex;
                    }
                }
            }
            if (writeIndex != writeStat)
            {
                sort.Sort(indexFixed, --writeIndex);
            }
            valueType[] newValues = new valueType[count];
            for (writeIndex = indexFixed, index = 0; index != count; ++index)
            {
                newValues[index] = values[(*writeIndex++).Index];
            }
            return(newValues);
        }