.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); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д