2016-03-22 2 views
0

моей задачей является написать код в 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

Действительно благодарен вам за помощь!

Приветствия Арик

+0

Я не вижу причин думать, что ваша функция 'heapSort()' вызывает изменение набора значений, содержащихся в массиве, хотя вы не представили полный код (любой код, который вы хотите, чтобы мы рассматривали, должен идти * в вопрос сам *). Я предлагаю вам использовать отладчик, чтобы разобраться в этом, но если вы хотите получить от нас помощь, нам обычно нравится видеть [mcve]. –

+0

В 'buildMaxHeap' вы используете индекс' i' в массив 'a', значение которого может быть выше, чем' n'. Если 'a' содержит значения' n', то 'i' не должно превышать' n-1'. –

+0

Когда вы вводите исходные данные, ваш счетчик «n» начинается с нуля и увеличивается после ввода каждого номера. Если вы вводите десять чисел, они вводятся в элементы массива с 0 по 9, но n равно 10. Добавьте «n -;» после выхода из цикла while. Теперь исправьте управление контуром printArray с помощью 'i <= n;' и, наконец, исправьте управление контуром printHeap 'i <(n + 1)/2;'. – anita2R

ответ

0

Ну, вы наблюдаете неопределенное поведение. (Я лично на онлайн IDE получил 0 вместо 12 (24).)

Try:

void heapSort(int a[], int n) 
{ 
    int x = n; /* changed from n+1 */ 
    int i; 
    int temp; 

    buildMaxHeap(a, n); 
    for (i = n-1; i >= 0; i--){ /*<-- changed*/ 
     temp = a[i]; 
     a[i] = a[0]; 
     a[0] = temp; 
     x--; 
     heapify(a, 0, x); 
    } 
} 

Ваши массивы почти на всех языках общего назначения сегодня начинаются с индекса 0 [Для основательной информации см wiki.] Вы ошибочно зацикливаете свой массив for (i = n; i >= 1; i--), а так как куча макс, не обрабатывайте первый элемент и не выходите за пределы с последним. Хотя арифметика с элементом nth определена в стандарте, это не значит, что это скорее < n, а некоторый указатель работает.

На боковой ноте вы можете использовать макросы (#define s) для функций left, right и т. Д., Чтобы улучшить производительность и облегчить чтение.

Я надеюсь, что это экономит день и AlgoDat Упражнение.

+0

Спасибо большое! ваше решение сработало :) –

Смежные вопросы