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