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;
            }
        }
    }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.167 из 5
Похожие ответы