예제 #1
0
        public T[] Sort(T[] array, Func <T, int> getKey)
        {
            Statics.Reset(array.Length, SortType, nameof(BucketSortT <T>));
            var size = array.Select(x => getKey(x)).Max() + 1;

            // 0 position
            var offset = 0;
            var min    = array.Select(x => getKey(x)).Min();

            // incase lower than 0
            if (min < 0)
            {
                offset = Math.Abs(min);
                size   = array.Select(x => getKey(x)).Max() - min + 1;
            }

            var bucket = new List <T> [size];
            var keys   = array.Select(x => getKey(x)).ToArray();

            foreach (var item in array)
            {
                statics.AddIndexAccess();
                statics.AddCompareCount();
                var key = getKey(item) + offset;
                if (bucket[key] == null)
                {
                    bucket[key] = new List <T>();
                }
                bucket[key].Add(item);
            }

            for (int j = 0, i = 0; j < bucket.Length; ++j)
            {
                if (bucket[j] != null)
                {
                    foreach (var item in bucket[j])
                    {
                        statics.AddIndexAccess();
                        array[i++] = item;
                    }
                }
                else
                {
                    statics.AddIndexAccess();
                }
            }

            return(array);
        }