/// <summary> /// Метод Sort сортирует коллекцию элементов, за время: /// лучшое: O(n^2), /// в среднем: O(n^2), /// в худшем: O(n^2). /// </summary> /// <typeparam name="T">Строготипизированный параметер метода, указывающий тип элементов коллекции</typeparam> /// <param name="list">Коллекция элементов</param> /// <returns>Возращает отсортированную коллекцию элементов</returns> public static IEnumerable <T> Sort <T>(this IEnumerable <T> list) where T : IComparable <T> { if (!list.Any()) { return(Enumerable.Empty <T>()); } IEnumerable <T> first = list.Where((item, j) => BooleanFunctions <T, T, Boolean> .Equals(list.ElementAt(j + 1), list.ElementAt(j))).Select(y => y).Sort(); IEnumerable <T> a = from item in list let minValue = list.Min() let minIndex = Array.FindIndex(list.ToArray(), x => BooleanFunctions <T, T, Boolean> .Equals(x, minValue)) where BooleanFunctions <T, Int32, Boolean> .Less(list.ToArray()[minIndex + 1], minIndex) orderby item select item; return(first); }
/// <summary> /// Метод MSort сортирует коллекцию элементов, за время: /// лучшое: O(n*log(n)), /// в среднем: O(n*log(n)), /// в худшем: O(n*log(n)). /// </summary> /// <typeparam name="T">Строготипизированный параметер метода, указывающий тип элементов коллекции</typeparam> /// <param name="list">Коллекция элементов</param> /// <returns>Возращает отсортированную коллекцию элементов</returns> public static IEnumerable <T> Sort <T>(IEnumerable <T> list) where T : IComparable <T> { if (!list.Any()) { return(Enumerable.Empty <T>()); } IEnumerable <T> first = list.Skip(0).Where((item) => list.Count() / 2 + 1 > list .Count() - 1 || (0 <= list.Count() / 2 + 1 && BooleanFunctions <T, T, Boolean> .Less(list.ElementAt(0), list.ElementAt(list.Count() / 2 + 1)))); IEnumerable <T> second = list.Skip(list.Count() / 2 + 1).Where(item => list .Count() / 2 + 1 > list.Count() - 1 || (0 <= list.Count() / 2 + 1 && BooleanFunctions <T, T, Boolean> .Less(list.ElementAt(list.Count() / 2 + 1), list.ElementAt(list.Count() - 1)))); return(first.Concat(second).OrderBy(u => u)); }