Функция max-heap работает нормально, но heapsort не работает.
Когда я запускаю этот код. показывает неверный расчет.
Your input is:
9 79 42 86 33 75
Your max-heap is:
86 79 42 75 33 9
Ascending numerical order:
86 79 42 75 33 9
Как вы можете видеть в моем последнем выводе, числовой порядок по возрастанию имеет то же значение, что и max-heap, но это не то, что я ожидаю.
Моя задача состоит в том, что я должен отсортировать число из максимальной кучи. Кроме того, мне нужно поменять местами первый и последний элемент из массива максимальной кучи, а затем игнорировать последний элемент. Кроме того, как только последний элемент будет проигнорирован, мне придется снова выполнить функцию max-heap.
Пример того, как работает расчет. max-heap: 86, 79, 42, 75, 33, 9. В разделе сортировки я должен поменять местами первый и последний элемент, а затем игнорировать последний элемент, поэтому результат сортировки кучи должен быть: 9, 79, 42 , 75, 33, [86] (квадратные скобки означают игнорирование или удаление). Я должен снова сделать max-heap из предыдущей сортировки. Второй результат максимальной кучи будет 79, 75, 9, 42, 33. когда я вернусь к сортировке, мне нужно поменять местами первый и последний элемент, а затем снова игнорировать последний элемент, поэтому максимальная куча равна 79, 75 , 9, 42, 33, а результат сортировки в куче должен быть: 33, 75, 9, 42, [79], [86]. Я должен сделать тот же шаг снова и снова, пока все числа не будут отсортированы.
Пример вывода, который я хочу отобразить:
Мой ввод 9, 79, 42, 86, 33, 75
Максимальная куча должна быть: 86, 79, 42, 75, 33, 9.
По возрастанию число должно быть: 9, 33, 42, 75, 79, 86.
Дополнительные примеры см. на веб-сайте https://en.wikipedia.org/wiki/Heapsort#Example, См. пример 2 — Сортировка
А вот код неправильного расчета:
#include "stdafx.h"
#include <iostream>
using namespace std;
int heap[30];
void main()
{
int n, index, parent, flag, dummy;
n = 7; //size of table
// user input number
for (index = 1; index < 7; index++)
{
cout << "Enter value " << index << ": ";
cin >> heap[index];
}
// output for user element
cout << "\nYour input is:\n";
for (index = 1; index < 7; index++)
{
cout << heap[index] << " ";
}
flag = 1;
while (flag == 1)
{
flag = 0;
//heapify
for (index = 7; index >1; index--)
{
parent = index / 2;
if (heap[parent] < heap[index])
{
dummy = heap[parent];
heap[parent] = heap[index];
heap[index] = dummy;
flag = 1;
}
// Sorting --> swap first and last of the array and then ignore the
//last array and reheap from above until all number sorted.
while (heap[0] >= 1)
{
int last = heap[0];
int temp1 = heap[1];
heap[1] = heap[last - 1];
heap[last - 1] = temp1;
heap[0]--;
}
}
}
cout << "\n\nYour max-heap is:\n";
for (index = 1; index < 7; index++) // output for after heap
{
cout << heap[index] << " ";
}
cout << "\n\nAscending numerical order:\n";
for (index = 1; index < 7; index++) //output for sorting.
{
cout << heap[index] << " ";
}
getchar();
getchar();
}
Также код, который я не могу изменить или заменить, который
while (flag == 1)
{
flag = 0;
//heapify
for (index = 6; index >1; index--)
{
parent = index / 2;
if (heap[parent] < heap[index])
{
dummy = heap[parent];
heap[parent] = heap[index];
heap[index] = dummy;
flag = 1;
}
}
}
std::make_heap
и связанные с ним функции. - person hlt   schedule 10.05.2018`code`
), но не на нескольких строках. Вы также должны убрать часть сортировки из части heapify — сделайте это после того, как вы напечатаете кучу, иначе вы получите странное несогласованное состояние. Только тогда мы сможем увидеть, действительно ли ваш код работает. - person hlt   schedule 10.05.2018