堆排序

来源:互联网 发布:淘宝卖家使用尺码 编辑:程序博客网 时间:2024/06/14 18:10

一般的教科书上在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 100void 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
原创粉丝点击