堆排序

一般的教科书上在heapsort函数构建堆的过程中写的是

for(i = N / 2;i >= 0; i--) {
    PercDown(A, i, n);
}

实际上这个有丁点问题,数组是从下标0开始的,因此下标为i的结点的双亲为(i - 1) / 2;所以最后一个又孩子的结点的下标为(N - 1) / 2,读者可以亲自实验,因此应修正为:

for(i = (N - 1) / 2;i >= 0; i--) {
    PercDown(A, i, n);
}

代码如下:

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

#define LeftChild(i) (2 * i + 1)
#define MaxNum 100

void input(int A[],int *e);
void output(int A[], int e);
void PercDown(int A[], int i, int N);
void heap_sort(int A[] , int N);

int main()
{
    int num[MaxNum], N;

    input(num, &N);

    heap_sort(num, N);

    output(num, N);

    return 0;
}

void input(int A[],int *e) {
    int i;

    printf("请输入元素个数:");
    scanf("%d",e);

    printf("请输入数组元素:");
    for(i = 0; i < *e; i++) {
        scanf("%d", &A[i]);
    }
}

void output(int A[], int e) {
    int i;

    printf("排序后顺序:");
    for(i = 0; i < e; i++) {
        printf("%d ",A[i]);
    }

}

void PercDown(int A[], int i, int N) {
    int child;
    int temp;

    for(temp = A[i]; LeftChild(i) < N; i = child) {
        child = LeftChild(i);

        if (child != N - 1 && A[child + 1] > A[child])
            child++;

        if(temp < A[child])
            A[i] = A[child];
        else
            break;
    }

    A[i] = temp;
}

void heap_sort(int A[] , int N) {
    int i;
    int temp;

    for(i = (N - 1) / 2;i >= 0; i--) {
        PercDown(A, i, N);
    }

    for(i = N - 1; i > 0; i--) {
        temp = A[0];
        A[0] = A[i];
        A[i] = temp;

        PercDown(A, 0, i);
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值