堆排序错误输出

时间:2016-06-28 09:08:02

标签: c algorithm sorting heapsort

使用堆排序算法挣扎,最终弄明白了,但仍然无法正常工作,我似乎无法找到问题,也许是因为我在过去的3个小时里一直在盯着它。 问题是它提供了错误的输入。该程序编译并没有错误。我使用Visual Studio 2013。 输入:{1,4,5,3,2,7,8,5,4,7,8,1} 预期输出:数组排序。

输出:1 2 3 5 7 1 4 4 7 8 5 8

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

void change(int *a, int *b){
    int aux;
    aux = *a;
    *a = *b;
    *b = aux;
}
void OrganizeHeap(int *A, int n, int i){
    int left = i * 2 + 1, right = i * 2 + 2;
    int largest = i;
    if (left < n && A[left] >= A[i])
        largest = left;

    if (right < n && A[right] >= A[i])
        largest = right;

    if (largest != i){
        change(&A[i], &A[largest]);
            OrganizeHeap(A, n, largest);
    }
}
void BuildHeap(int *A, int n){
    for (int i = n / 2 - 1; i >= 0; i--)
        OrganizeHeap(A, n, i);
}
void HeapSort(int *A, int n){
    BuildHeap(A, n);
    for (int i = n - 1; i >= 0; i--){
        change(&A[0], &A[i]);
        OrganizeHeap(A, i, 0);
    }
}
int main() {
    int max;
    int A[] = { 1, 4, 5, 3, 2, 7, 8, 5, 4, 7, 8, 1 };
    int n = sizeof(A) / sizeof(int);
    HeapSort(A, n);
    for (int i = 0; i < n; i++)
        printf("%d ", A[i]);
    _getch();
    return 0;
}

1 个答案:

答案 0 :(得分:1)

您的代码中存在两个问题

    if (right < n && A[right] >= A[i])
          largest = right;

如果A[i]5A[left]7,则largest将设置为left,该怎么办? 现在,如果A [右]是6,那么[右]大于A[i],因此最大值将设置为rightlargest应为left而不是right,因为A[left] > A[right] 所以你可以做类似

的事情
  if (right < n && A[right] >= A[largest]) //see note below

编辑代码后,第二个问题已被删除。

注意:

在检查时您可以使用>代替>=