Beispiel #1
0
 /// <summary>
 /// 数组范围排序
 /// </summary>
 /// <typeparam name="valueType">数据类型</typeparam>
 /// <param name="values">待排序数组</param>
 /// <param name="startIndex">起始位置</param>
 /// <param name="count">排序范围数据数量</param>
 /// <param name="getKey">排序键值获取器</param>
 /// <param name="skipCount">跳过数据数量</param>
 /// <param name="getCount">排序数据数量</param>
 /// <returns>排序后的数组</returns>
 public unsafe static valueType[] GetRangeSort/*Compare[0]*//*Compare[0]*/ <valueType>
     (valueType[] values, int startIndex, int count, func <valueType, /*Type[0]*/ ulong /*Type[0]*/> getKey, int skipCount, int getCount)
 {
     array.range range = new array.range(values.length(), startIndex, count);
     if ((count = range.GetCount) != 0)
     {
         array.range getRange = new array.range(count, skipCount, getCount);
         if ((getCount = getRange.GetCount) != 0)
         {
             if (getKey == null)
             {
                 log.Default.Throw(log.exceptionType.Null);
             }
             if (values.Length > (config.pub.Default.StreamBufferLength >> 4))
             {
                 /*Type[2]*/
                 ulongSortIndex /*Type[2]*/[] indexs = new /*Type[2]*/ ulongSortIndex /*Type[2]*/[count];
                 fixed(/*Type[2]*/ ulongSortIndex /*Type[2]*/ *fixedIndex = indexs)
                 {
                     return(getRangeSort/*Compare[0]*//*Compare[0]*/
                                (values, range.SkipCount, count, getKey, getRange.SkipCount, getCount, fixedIndex));
                 }
             }
             else
             {
                 /*Type[2]*/
                 ulongSortIndex /*Type[2]*/ *fixedIndex = stackalloc /*Type[2]*/ ulongSortIndex /*Type[2]*/[count];
                 return(getRangeSort/*Compare[0]*//*Compare[0]*/
                            (values, range.SkipCount, count, getKey, getRange.SkipCount, getCount, fixedIndex));
             }
         }
     }
     return(nullValue <valueType> .Array);
 }
Beispiel #2
0
        /// <summary>
        /// 数组范围排序
        /// </summary>
        /// <typeparam name="valueType">数据类型</typeparam>
        /// <param name="values">待排序数组</param>
        /// <param name="startIndex">起始位置</param>
        /// <param name="count">排序范围数据数量</param>
        /// <param name="getKey">排序键值获取器</param>
        /// <param name="skipCount">跳过数据数量</param>
        /// <param name="getCount">排序数据数量</param>
        /// <param name="fixedIndex">索引位置</param>
        /// <returns>排序后的数组</returns>
        private unsafe static valueType[] getRangeSort/*Compare[0]*//*Compare[0]*/ <valueType>
            (valueType[] values, int startIndex, int count, func <valueType, /*Type[0]*/ ulong /*Type[0]*/> getKey, int skipCount, int getCount
            , /*Type[2]*/ ulongSortIndex /*Type[2]*/ *fixedIndex)
        {
            /*Type[2]*/
            ulongSortIndex /*Type[2]*/ *writeIndex = fixedIndex;

            for (int index = startIndex, endIndex = startIndex + count; index != endIndex; ++index)
            {
                *writeIndex++ = new /*Type[2]*/ ulongSortIndex /*Type[2]*/ {
                    Value = getKey(values[index]), Index = index
                };
            }
            new /*Type[3]*/ ulongRangeIndexSorter/*Type[3]*//*Compare[0]*//*Compare[0]*/
            {
                SkipCount   = fixedIndex + skipCount,
                GetEndIndex = fixedIndex + skipCount + getCount - 1
            }.Sort(fixedIndex, fixedIndex + count - 1);
            valueType[] newValues = new valueType[getCount];
            writeIndex = fixedIndex + skipCount;
            for (int index = 0; index != newValues.Length; ++index)
            {
                newValues[index] = values[(*writeIndex++).Index];
            }
            return(newValues);
        }
Beispiel #3
0
        /// <summary>
        /// 排序去除Top N
        /// </summary>
        /// <typeparam name="valueType">数据类型</typeparam>
        /// <param name="values">待排序数组</param>
        /// <param name="getKey">排序键值获取器</param>
        /// <param name="count">排序数据数量</param>
        /// <returns>排序后的数据</returns>
        private unsafe static valueType[] getRemoveTop/*Compare[0]*//*Compare[0]*/ <valueType>
            (valueType[] values, func <valueType, /*Type[0]*/ ulong /*Type[0]*/> getKey, int count)
        {
            valueType[] newValues = new valueType[count];
            count = values.Length - count;
            uint sqrtMod;
            int  length = Math.Min(Math.Max(count << 2, count + (int)number.sqrt((uint)values.Length, out sqrtMod)), values.Length);

            if (length > (config.pub.Default.StreamBufferLength >> 4))
            {
                /*Type[2]*/
                ulongSortIndex /*Type[2]*/[] removeValues = new /*Type[2]*/ ulongSortIndex /*Type[2]*/[length];
                fixed(/*Type[2]*/ ulongSortIndex /*Type[2]*/ *removeFixed = removeValues)
                {
                    removeTop/*Compare[0]*//*Compare[0]*/ (values, getKey, count, newValues, length, removeFixed);
                }
            }
            else
            {
                /*Type[2]*/
                ulongSortIndex /*Type[2]*/ *removeFixed = stackalloc /*Type[2]*/ ulongSortIndex /*Type[2]*/[length];
                removeTop/*Compare[0]*//*Compare[0]*/ (values, getKey, count, newValues, length, removeFixed);
            }
            return(newValues);
        }
Beispiel #4
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 unsafe 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++ = new /*Type[2]*/ ulongSortIndex /*Type[2]*/ {
                    Value = getKey(values[index]), Index = index
                };
                ++index;
            }
            /*Type[2]*/
            ulongSortIndex /*Type[2]*/ *writeStat = indexFixed + count, writeIndex = writeStat;
            /*Type[3]*/
            ulongRangeIndexSorter /*Type[3]*//*Compare[0]*//*Compare[0]*/ sort
                = new /*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 = new /*Type[2]*/ ulongSortIndex /*Type[2]*/ {
                        Value = value, Index = 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);
        }
Beispiel #5
0
        /// <summary>
        /// 数组范围排序
        /// </summary>
        /// <typeparam name="valueType">数据类型</typeparam>
        /// <param name="values">待排序数组</param>
        /// <param name="getKey">排序键值获取器</param>
        /// <param name="skipCount">跳过数据数量</param>
        /// <param name="getCount">排序数据数量</param>
        /// <param name="fixedIndex">索引位置</param>
        /// <returns>排序后的数组</returns>
        private unsafe static valueType[] getRangeSort/*Compare[0]*//*Compare[0]*/ <valueType>
            (valueType[] values, func <valueType, /*Type[0]*/ ulong /*Type[0]*/> getKey, int skipCount, int getCount
            , /*Type[2]*/ ulongSortIndex /*Type[2]*/ *fixedIndex)
        {
            /*Type[2]*/
            ulongSortIndex /*Type[2]*/ *writeIndex = fixedIndex;

            for (int index = 0; index != values.Length; ++index)
            {
                *writeIndex++ = new /*Type[2]*/ ulongSortIndex /*Type[2]*/ {
                    Value = getKey(values[index]), Index = index
                };
            }
            return(getRangeSort/*Compare[0]*//*Compare[0]*/ (values, skipCount, getCount, fixedIndex));
        }
Beispiel #6
0
        /// <summary>
        /// 排序取Top N
        /// </summary>
        /// <typeparam name="valueType">数据类型</typeparam>
        /// <param name="values">待排序数组</param>
        /// <param name="getKey">排序键值获取器</param>
        /// <param name="count">排序数据数量</param>
        /// <returns>排序后的数据</returns>
        private unsafe static valueType[] getTop/*Compare[0]*//*Compare[0]*/ <valueType>
            (valueType[] values, func <valueType, /*Type[0]*/ ulong /*Type[0]*/> getKey, int count)
        {
            uint sqrtMod;
            int  length = Math.Min(Math.Max(count << 2, count + (int)number.sqrt((uint)values.Length, out sqrtMod)), values.Length);

            if (length > (config.pub.Default.StreamBufferLength >> 4))
            {
                /*Type[2]*/
                ulongSortIndex /*Type[2]*/[] indexs = new /*Type[2]*/ ulongSortIndex /*Type[2]*/[length];
                fixed(/*Type[2]*/ ulongSortIndex /*Type[2]*/ *indexFixed = indexs)
                {
                    return(getTop/*Compare[0]*//*Compare[0]*/ (values, getKey, count, length, indexFixed));
                }
            }
            else
            {
                /*Type[2]*/
                ulongSortIndex /*Type[2]*/ *indexFixed = stackalloc /*Type[2]*/ ulongSortIndex /*Type[2]*/[length];
                return(getTop/*Compare[0]*//*Compare[0]*/ (values, getKey, count, length, indexFixed));
            }
        }
Beispiel #7
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="indexFixed">索引位置</param>
        private unsafe 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++ = new /*Type[2]*/ ulongSortIndex /*Type[2]*/ {
                    Value = getKey(values[index]), Index = index
                };
                ++index;
            }
            /*Type[2]*/
            ulongSortIndex /*Type[2]*/ *removeStart = removeFixed + (count = length - count), removeIndex = removeFixed;
            /*Type[3]*/
            ulongRangeIndexSorter /*Type[3]*//*Compare[0]*//*Compare[0]*/ sort
                = new /*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 = new /*Type[2]*/ ulongSortIndex /*Type[2]*/ {
                        Value = value, Index = 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];
                }
            }
        }