/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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)); }
/// <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)); } }
/// <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]; } } }