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