使用堆排序算法挣扎,最终弄明白了,但仍然无法正常工作,我似乎无法找到问题,也许是因为我在过去的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;
}
答案 0 :(得分:1)
您的代码中存在两个问题
if (right < n && A[right] >= A[i])
largest = right;
如果A[i]
为5
,A[left]
为7
,则largest
将设置为left
,该怎么办?
现在,如果A [右]是6
,那么[右]大于A[i]
,因此最大值将设置为right
。largest
应为left
而不是right
,因为A[left] > A[right]
所以你可以做类似
if (right < n && A[right] >= A[largest]) //see note below
编辑代码后,第二个问题已被删除。
注意:
在检查时您可以使用>
代替>=