예제 #1
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));
        }
예제 #2
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[] GetSort/*Compare[0]*//*Compare[0]*/ <valueType>(valueType[] array, Func <valueType, /*Type[0]*/ ulong /*Type[0]*/> getKey, int index, int count)
        {
            if (count >= AutoCSer.Algorithm.RadixSort.SortSize64)
            {
                int size = (count << 1) * sizeof(AutoCSer.Algorithm./*Type[1]*/ ULongSortIndex /*Type[1]*/);

                UnmanagedPool pool = AutoCSer.Algorithm.RadixSort.GetUnmanagedPool(size);
                Pointer.Size  data = pool.GetSize(size);
                try
                {
                    AutoCSer.Algorithm./*Type[1]*/ ULongSortIndex /*Type[1]*/ *indexFixed = (AutoCSer.Algorithm./*Type[1]*/ ULongSortIndex /*Type[1]*/ *)data.Data;
                    AutoCSer.Algorithm./*Type[1]*/ ULongSortIndex /*Type[1]*/.Create(indexFixed, array, getKey, index, count);
                    AutoCSer.Algorithm.RadixSort.Sort/*Compare[0]*//*Compare[0]*/ (indexFixed, indexFixed + count, count);
                    return(AutoCSer.Algorithm./*Type[1]*/ ULongSortIndex /*Type[1]*/.Create(indexFixed, array, count));
                }
                finally { pool.PushOnly(ref data); }
            }
            return(AutoCSer.Algorithm.FixedArrayQuickSort.GetSort/*Compare[0]*//*Compare[0]*/ (array, getKey, index, count));
        }