我一直试图在C中使用Heap排序算法的实现中找到错误但是无法找到它。编译正常但是当我执行程序时它会出错。
#include<stdio.h>
int cmp(int *a, int *b){return *a-*b;}
void swap(int *a, int *b){
int temp;
temp=*a; *a=*b; *b=temp;}
void sift_down(int *A,int parent, int n){
int child;
if((child=2*parent+1)<n){
if(child+1<n && cmp(A+child,A+child+1)<0){
child++;
}}
if(cmp(A+parent,A+child)<0){
swap(A+parent,A+child);
sift_down(A,child,n);
}}
void build_heap(int A[], int n){
int i;
for(i=(n/2)-1;i>=0;i--){
sift_down(A,i,n);
}
}
void heapsort(int A[], int n){
int active;
build_heap(A,n);
for(active=n-1;active>0;active--){
swap(A,A+active);
sift_down(A,0,active);
}
}
int main(){
int A[]={13,16,14,10,15,17,18,30,25},i,n;
n=sizeof(A)/sizeof(A[0]);
heapsort(A,n);
for(i=0;i<n;i++){
printf("%d\t",A[i]);
}
}
答案 0 :(得分:2)
有趣的支撑风格。未解开,您的函数sift_down
如下所示:
void sift_down(int *A, int parent, int n)
{
int child;
if ((child = 2 * parent + 1) < n) {
if (child + 1 < n && cmp(A + child, A + child + 1) < 0) {
child++;
}
}
if (cmp(A + parent, A + child) < 0) {
swap(A + parent, A + child);
sift_down(A, child, n);
}
}
if
不应该是连续的,它们应该是嵌套的。否则,您将在child
和cmp
函数 - segmentaion fault中访问数组末尾之外的swap
。
所以你的功能应该是这样的:
void sift_down(int *A, int parent, int n)
{
int child = 2 * parent + 1;
if (child < n) {
if (child + 1 < n && cmp(A + child, A + child + 1) < 0) {
child++;
}
if (cmp(A + parent, A + child) < 0) {
swap(A + parent, A + child);
sift_down(A, child, n);
}
}
}
(我也冒昧地将作业从child
移出if
。