wangzheng3056 发表于 2013-7-31 12:04

【转】c语言版堆排序

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define random(i) (rand()%i)
#define N        15

//维护堆的性质,这里是用的最大堆
//且为二叉堆
void MAX_HEAPIFY(int A[],int i,int heapSize){
        int l;//表示节点i的左孩子
        int r;//表示节点i的右孩子
        int largest;//表示最大元素,也就是根.
        int temp;//临时变量,用于交换
        int k;
        l=2*i+1;
        r=2*i+2;
        if((l<heapSize)&&(A>A))                //如果左孩子大,那么记下下标
        {
                largest=l;
        }
        else
        {
                largest=i;

        }
        if ((r<heapSize)&&(A>A))
        {
                largest=r;
        }
        if (largest!=i)
        {
                temp=A;
                A=A;
                A=temp;
                //递归调用
                MAX_HEAPIFY(A,largest,heapSize);
        }
       
}

//建堆
void BUILD_HEAP(int A[]){
        int i;
        for (i=N/2-1;i>=0;i--)
        {
                MAX_HEAPIFY(A,i,N);
        }

}

//堆排序
void HEAP_SORT(int A[]){
        int  i;
        int j=0;
        int temp;        //交换时用的临时变量
        int size=N;        //size代表元素个数
        //先建堆
        BUILD_HEAP(A);
        for(i=N-1;i>0;i--)
        {
                //因为根节点总是最大的数,我们每次把根节点换到相应位置即可实现排序
                //堆排序的时间复杂度为O(nlgn)
                temp=A;
                A=A;
                A=temp;
                size--;
                MAX_HEAPIFY(A,0,size);

        }
        for(j=0;j<N;j++)
        {
                printf("%5d",A);
        }

}
void main(){

        int rand_no=0;
        int i=0;
        int a;                                //n表示数组长度
        srand((int)time(0));                //设置随机数种子
        printf("==============================排序前=========================================");
        printf("\n");
        for(rand_no=0;rand_no<N;rand_no++)
        {

                a=random(100);
                printf("%5d",a);
               
        }
        printf("\n");
        printf("==============================排序后=========================================\n");
        HEAP_SORT(a);
        printf("\n");       


}

WXYINHIT 发表于 2014-1-9 17:27


好顶赞,不明觉厉,不觉明厉

WXYINHIT 发表于 2014-1-9 17:27


好顶赞,不明觉厉,不觉明厉

WXYINHIT 发表于 2014-1-9 17:27


好顶赞,不明觉厉,不觉明厉

WXYINHIT 发表于 2014-1-9 17:27


好顶赞,不明觉厉,不觉明厉

WXYINHIT 发表于 2014-1-9 17:28


好顶赞,不明觉厉,不觉明厉

WXYINHIT 发表于 2014-1-9 17:28


好顶赞,不明觉厉,不觉明厉

WXYINHIT 发表于 2014-1-9 17:28


好顶赞,不明觉厉,不觉明厉

WXYINHIT 发表于 2014-1-9 17:28


好顶赞,不明觉厉,不觉明厉

WXYINHIT 发表于 2014-1-9 17:28


好顶赞,不明觉厉,不觉明厉
页: [1] 2
查看完整版本: 【转】c语言版堆排序