一般的教科书上在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);
}
}