/// <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);
        }
Example #2
0
        /// <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));
        }