示例#1
0
        /// <summary>
        /// 数组排序
        /// </summary>
        /// <typeparam name="valueType">数据类型</typeparam>
        /// <param name="values">待排序数组</param>
        /// <param name="getKey">排序键值获取器</param>
        /// <param name="startIndex">起始位置</param>
        /// <param name="count">排序数据数量</param>
        /// <returns>排序后的数组</returns>
        public static valueType[] GetSortDesc <valueType>(valueType[] values, Func <valueType, ulong> getKey, int startIndex, int count)
        {
            int length = count * sizeof(ULongSortIndex);

            AutoCSer.Memory.UnmanagedPool pool = AutoCSer.Memory.UnmanagedPool.GetPool(length);
            AutoCSer.Memory.Pointer       data = pool.GetMinSize(length);
            try
            {
                return(getSortDesc(values, getKey, startIndex, count, (ULongSortIndex *)data.Data));
            }
            finally { pool.Push(ref data); }
        }
示例#2
0
        /// <summary>
        /// 排序取Top N
        /// </summary>
        /// <typeparam name="valueType">数据类型</typeparam>
        /// <param name="values">待排序数组</param>
        /// <param name="getKey">排序键值获取器</param>
        /// <param name="count">排序数据数量</param>
        /// <returns>排序后的数据</returns>
        private static valueType[] getTopDesc <valueType>(valueType[] values, Func <valueType, ulong> getKey, int count)
        {
            uint sqrtMod;
            int  length = Math.Min(Math.Max(count << 2, count + (int)AutoCSer.Extensions.NumberExtension.sqrt((uint)values.Length, out sqrtMod)), values.Length), size = length * sizeof(ULongSortIndex);

            AutoCSer.Memory.UnmanagedPool pool = AutoCSer.Memory.UnmanagedPool.GetPool(size);
            AutoCSer.Memory.Pointer       data = pool.GetMinSize(size);
            try
            {
                return(getTopDesc(values, getKey, count, length, (ULongSortIndex *)data.Data));
            }
            finally { pool.Push(ref data); }
        }
示例#3
0
        /// <summary>
        /// 数组范围排序
        /// </summary>
        /// <typeparam name="valueType">数据类型</typeparam>
        /// <typeparam name="returnType">返回数据类型</typeparam>
        /// <param name="array">待排序数组</param>
        /// <param name="getKey">排序键值获取器</param>
        /// <param name="skipCount">跳过数据数量</param>
        /// <param name="getCount">排序数据数量</param>
        /// <param name="getValue">获取返回数据</param>
        /// <returns>排序后的数组</returns>
        internal static returnType[] UnsafeGetRangeSortDesc <valueType, returnType>(valueType[] array, Func <valueType, ulong> getKey, int skipCount, int getCount, Func <valueType, returnType> getValue)
        {
            if (getCount == 0)
            {
                return(EmptyArray <returnType> .Array);
            }
            int size = array.Length * sizeof(ULongSortIndex);

            AutoCSer.Memory.UnmanagedPool pool = AutoCSer.Memory.UnmanagedPool.GetPool(size);
            AutoCSer.Memory.Pointer       data = pool.GetMinSize(size);
            try
            {
                return(getRangeSortDesc(array, getKey, skipCount, getCount, getValue, (ULongSortIndex *)data.Data));
            }
            finally { pool.Push(ref data); }
        }
示例#4
0
        /// <summary>
        /// 获取匹配数组
        /// </summary>
        /// <param name="array">数组数据</param>
        /// <param name="isValue">数据匹配器</param>
        /// <returns>匹配数组</returns>
        public static ulong[] getFindArray(this SubArray <ulong> array, Func <ulong, bool> isValue)
        {
            if (array.Length == 0)
            {
                return(EmptyArray <ulong> .Array);
            }
            int length = ((array.Length + 63) >> 6) << 3;

            AutoCSer.Memory.UnmanagedPool pool = AutoCSer.Memory.UnmanagedPool.GetPool(length);
            AutoCSer.Memory.Pointer       data = pool.GetMinSize(length);
            try
            {
                AutoCSer.Memory.Common.Clear(data.ULong, length >> 3);
                return(FixedArray.GetFindArray(array.Array, array.Start, array.Length, isValue, new MemoryMap(data.Data)));
            }
            finally { pool.Push(ref data); }
        }
示例#5
0
        /// <summary>
        /// 数组子串排序
        /// </summary>
        /// <typeparam name="valueType">数据类型</typeparam>
        /// <param name="array">待排序数组子串</param>
        /// <param name="getKey">排序键</param>
        /// <param name="index">起始位置</param>
        /// <param name="count">数量</param>
        /// <returns>排序后的数组</returns>
        internal static valueType[] GetSortDesc <valueType>(valueType[] array, Func <valueType, ulong> getKey, int index, int count)
        {
            if (count >= AutoCSer.Algorithm.RadixSort.SortSize64)
            {
                int size = (count << 1) * sizeof(AutoCSer.Algorithm.ULongSortIndex);

                AutoCSer.Memory.UnmanagedPool pool = AutoCSer.Memory.UnmanagedPool.GetPool(size);
                AutoCSer.Memory.Pointer       data = pool.GetMinSize(size);
                try
                {
                    AutoCSer.Algorithm.ULongSortIndex *indexFixed = (AutoCSer.Algorithm.ULongSortIndex *)data.Data;
                    AutoCSer.Algorithm.ULongSortIndex.Create(indexFixed, array, getKey, index, count);
                    AutoCSer.Algorithm.RadixSort.SortDesc(indexFixed, indexFixed + count, count);
                    return(AutoCSer.Algorithm.ULongSortIndex.Create(indexFixed, array, count));
                }
                finally { pool.Push(ref data); }
            }
            return(AutoCSer.Algorithm.FixedArrayQuickSort.GetSortDesc(array, getKey, index, count));
        }