Изучение структуры данных. Макс куча. Сортировочная часть, необходимость второго циклаC#

Место общения программистов C#
Ответить
Anonymous
 Изучение структуры данных. Макс куча. Сортировочная часть, необходимость второго цикла

Сообщение Anonymous »

Нам дали код:

Код: Выделить всё

internal class Program
{
static void Main(string[] args)
{
int[] arr = { 10, 40, 30, 20, 10, 5, 8 };
int n = arr.Length;
int i;

heapsort(arr, n);

Console.Write("\nAfter heap sort the array is:");
for (i = 0; i < n; i++) { Console.Write(arr[i] + " "); }

PriotrityQueue(arr, n);
Console.Write("\nAfter deleting the item from priority queue the array is:");
for (i = 0; i < n - 1; i++) { Console.Write(arr[i] + " "); }

Console.ReadKey();
}

static void maxHeapify(int[] arr, int n, int i)
{
int large = i; //supposedly element with index i is maximum
int left_child = 2 * i + 1;
int right_child = 2 * i + 2;
if (left_child < n && arr[left_child] > arr[large])
large = left_child;
if (right_child < n && arr[right_child] > arr[large])
large = right_child;
if (large != i)
{
int temp = arr[i];
arr[i] = arr[large];
arr[large] = temp;
maxHeapify(arr, n, large);
}
}

static void heapsort(int[] arr, int n)
{
for (int i = n - 1; i >= 0; i--)
maxHeapify(arr, n, i);
for (int i = n - 1; i >= 0; i--) //this is the loop I do not understand
{
int temp = arr[0];
arr[0] = arr[i];
arr[i] = temp;
maxHeapify(arr, i, 0);
}
}

static void PriotrityQueue(int[] arr, int n)
{
if (n = 0; i--) //this is the loop I do not understand
{
int temp = arr[0];
arr[0] = arr[i];
arr[i] = temp;
maxHeapify(arr, i, 0);
}
Я просмотрел разные источники, и они используют этот второй цикл без объяснения причин. Я просто не понимаю, зачем он нужен.
Без него я получаю правильный (опять же из моего понимания максимальной кучи) результат:
После удаления элемента из приоритетной очереди массив такой: 30 20 8 10 10 5.
Если я использую цикл, я получаю это:
После сортировки кучи массив имеет вид 8 10 10 20 30 40 — это просто отсортированный массив в в порядке возрастания
После удаления элемента из приоритетной очереди массив такой: 40 8 10 10 20 30 — это неправильно
Я просто пытаюсь понять, почему второй здесь используется цикл или почему его потенциально можно использовать для сортировки.
Принимаются любые идеи.

Подробнее здесь: https://stackoverflow.com/questions/785 ... econd-loop
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»