Heapsort (метод кучи, пирамидальная сортировка) для строк - C#
Формулировка задачи:
Доброго всем времени суток, может ли кто-то поделиться опытом сортировки по алфавиту методом heapsort?
Есть массив array с названиями, которые нужно отсортировать, знаю как применять алгоритм к числам, а как ко строкам?
Как переделать данный алгоритм для строк?
public static void heapify(int[] arr, int pos, int size) { int temp; while (2 * pos + 1 < size) { int t = 2 * pos + 1; if (2 * pos + 2 < size && arr[2 * pos + 2] >= arr[t]) { t = 2 * pos + 2; } if (arr[pos] < arr[t]) { temp = arr[pos]; arr[pos] = arr[t]; arr[t] = temp; pos = t; } else break; } } public static void heap_make(int[] arr, int n) { for (int i = n - 1; i >= 0; i--) { heapify(arr, i, n); } } public static void heap_sort(int[] arr, int n) { int temp; heap_make(arr, n); while (n > 0) { temp = arr[0]; arr[0] = arr[n - 1]; arr[n - 1] = temp; n--; heapify(arr, 0, n); } }
Решение задачи: «Heapsort (метод кучи, пирамидальная сортировка) для строк»
textual
Листинг программы
internal static class HeapSort { internal static void Sort<T>(T[] array, int offset, int length, Comparison<T> comparison) { if (array == null) throw new ArgumentNullException("array"); if (offset < 0 || length < 0) throw new ArgumentOutOfRangeException((length < 0 ? "length" : "offset"), "Non-negative number required."); if (array.Length - offset < length) throw new ArgumentException("Offset and length were out of bounds for the array or count is greater than the number of elements from index to the end of the source collection."); if (comparison == null) throw new ArgumentNullException("comparison"); for (var i = 0; i < length; i++) { var index = i; var item = array[offset + i]; while (index > 0 && comparison(array[offset + (index - 1) / 2], item) < 0) { var top = (index - 1) / 2; array[offset + index] = array[offset + top]; index = top; } array[offset + index] = item; } for (var i = length - 1; i > 0; i--) { var last = array[offset + i]; array[offset + i] = array[offset]; var index = 0; while (index * 2 + 1 < i) { int left = index * 2 + 1, right = left + 1; if (right < i && comparison(array[offset + left], array[offset + right]) < 0) { if (comparison(last, array[offset + right]) > 0) break; array[offset + index] = array[offset + right]; index = right; } else { if (comparison(last, array[offset + left]) > 0) break; array[offset + index] = array[offset + left]; index = left; } } array[offset + index] = last; } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д