моей задачей является написать код в heapsort в соответствии с псевдокодом. Он должен распаковать входной массив (4 3 2 5 6 7 8 9 12 1
), а затем распечатать его с помощью метода printHeap. Я знаю, что printHeap работает, потому что я уже использовал его с помощью метода buildHeap (для создания массивных кучных двоичных деревьев, но вы все уже знаете это :)), и там он работает безупречно, поэтому моя проблема кроется в heapSort ,Проблемы с HeapSort
Он правильно сортирует и печатает его так, как это предполагается (родительский - ребенок 1, родительский - 2 и т. Д.), Только проблема заключается в том, что самое большое и последнее значение, которое равно 12, внезапно превращается в 24 и я не знаю, почему.
Код следующее:
void heapSort(int a[], int n){
int x = n+1;
int i;
int temp;
buildMaxHeap(a, n);
for (i = n; i >= 1; i--){
temp = a[i];
a[i] = a [0];
a [0] = temp;
x--;
heapify(a, 0, x);
}
void printHeap(int a[], int n){
int i;
printf("graph g { \n");
for (i = 0; i < n/2; i++){
printf("%d -- %d\n", a[i], a[left(i)]);
if (right(i) < n){
printf("%d -- %d\n", a[i], a[right(i)]);
}
}
printf("}\n");
Вывод следующий:
1 2 3 4 5 6 7 8 9 24
graph g {
1 -- 2
1 -- 3
2 -- 4
2 -- 5
3 -- 6
3 -- 7
4 -- 8
4 -- 9
5 -- 24
}
просто так что вы точно знаете, что я сделал, я присоединит время .c файл здесь: https://onedrive.live.com/redir?resid=8BC629F201D2BC63!26268&authkey=!AFqVlm9AptiZ_xM&ithint=file%2cc
Действительно благодарен вам за помощь!
Приветствия Арик
Я не вижу причин думать, что ваша функция 'heapSort()' вызывает изменение набора значений, содержащихся в массиве, хотя вы не представили полный код (любой код, который вы хотите, чтобы мы рассматривали, должен идти * в вопрос сам *). Я предлагаю вам использовать отладчик, чтобы разобраться в этом, но если вы хотите получить от нас помощь, нам обычно нравится видеть [mcve]. –
В 'buildMaxHeap' вы используете индекс' i' в массив 'a', значение которого может быть выше, чем' n'. Если 'a' содержит значения' n', то 'i' не должно превышать' n-1'. –
Когда вы вводите исходные данные, ваш счетчик «n» начинается с нуля и увеличивается после ввода каждого номера. Если вы вводите десять чисел, они вводятся в элементы массива с 0 по 9, но n равно 10. Добавьте «n -;» после выхода из цикла while. Теперь исправьте управление контуром printArray с помощью 'i <= n;' и, наконец, исправьте управление контуром printHeap 'i <(n + 1)/2;'. – anita2R