.NET 4.x Сортировка слиянием - C#
Формулировка задачи:
Есть желающие реализовать сортировку слиянием без рекурсии (generic, iterative merge-sort), с обобщёнными типами и с перегрузкой для сортировки части массива (index - индекс включая от которого сортируется последовательность длинной length внутри массива array)?
Критикуем
Листинг программы
- internal static class MergeSort
- {
- public static void Sort<T>(T[] array, int index, int length, Comparison<T> comparison)
- {
- var b = new T[length];
- for (var width = index + 1; width < length; width = 2 * width)
- {
- for (var i = index; i < length; i = i + 2 * width)
- Merge(array, b, i, Math.Min(i + width, length), Math.Min(i + 2 * width, length), comparison);
- Array.Copy(b, 0, array, index, length);
- }
- }
- private static void Merge<T>(T[] a, T[] b, int left, int midle, int right, Comparison<T> comparison)
- {
- var l = left;
- var m = midle;
- for (var j = left; j < right; j++)
- if (l >= midle || (m < right && comparison(a[l], a[m]) > 0))
- b[j] = a[m++];
- else
- b[j] = a[l++];
- }
- }
Решение задачи: «.NET 4.x Сортировка слиянием»
textual
Листинг программы
- public static IEnumerable<T> MSort<T>(this IEnumerable<T> list) where T : IComparable<T>
- {
- if (!list.Any()) return Enumerable.Empty<T>();
- Int32 begin = 0;
- Int32 end = list.Count();
- Int32 middle = (begin + end) / 2;
- IEnumerable<T> first = list.Skip(begin).Where(item => middle + 1 > end || (begin <= middle + 1 && BooleanFunctions<T, Boolean>.Less(list.ElementAt(begin), list.ElementAt(middle + 1))));
- IEnumerable<T> second = list.Skip(middle + 2).Where(item => middle + 2 > end || (begin <= middle + 2 && BooleanFunctions<T, Boolean>.Less(list.ElementAt(middle + 2), list.ElementAt(end))));
- return first.Concat(second);
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д