C中的Heap排序实现有什么问题?

时间:2014-05-19 10:51:10

标签: c sorting heap

我一直试图在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]);
        }
}

1 个答案:

答案 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不应该是连续的,它们应该是嵌套的。否则,您将在childcmp函数 - 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