/// <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 removeTopDesc <valueType>(valueType[] values, Func <valueType, ulong> getKey, int count, valueType[] newValues, int length, ULongSortIndex *removeFixed) { int index = 0, writeIndex = 0; ULongSortIndex *removeEnd = removeFixed; while (index != length) { (*removeEnd++).Set(getKey(values[index]), index++); } ULongSortIndex *removeStart = removeFixed + (count = length - count), removeIndex = removeFixed; FixedArrayQuickRangeSort.ULongRangeIndexSorterDesc sort = new FixedArrayQuickRangeSort.ULongRangeIndexSorterDesc { SkipCount = removeStart, GetEndIndex = removeStart }; sort.Sort(removeFixed, --removeEnd); while (writeIndex != count) { newValues[writeIndex++] = values[(*removeIndex++).Index]; } for (ulong maxValue = (*removeStart).Value; index != values.Length; ++index) { ulong value = getKey(values[index]); if (value.CompareTo(maxValue) >= 0) { 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]; } } }
/// <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[] getTopDesc <valueType>(valueType[] values, Func <valueType, ulong> getKey, int count, int length, ULongSortIndex *indexFixed) { ULongSortIndex *writeEnd = indexFixed; int index = 0; while (index != length) { (*writeEnd++).Set(getKey(values[index]), index++); } ULongSortIndex *writeStat = indexFixed + count, writeIndex = writeStat; FixedArrayQuickRangeSort.ULongRangeIndexSorterDesc sort = new FixedArrayQuickRangeSort.ULongRangeIndexSorterDesc { SkipCount = writeStat - 1, GetEndIndex = writeStat - 1 }; sort.Sort(indexFixed, --writeEnd); for (ulong maxValue = (*sort.SkipCount).Value; index != values.Length; ++index) { ulong value = getKey(values[index]); if (value.CompareTo(maxValue) > 0) { (*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); }