堆排序

来源:互联网 发布:威廉马歇尔 知乎 编辑:程序博客网 时间:2024/05/29 15:44
#include <stdio.h>#include <stdlib.h>#include <math.h>int PARENT(int i)               //父节点{    return floor(2/i);}int LEFT(int i)                 //左孩子{    return 2*i;}int RIGHT(int i)                //右孩子{    return 2*i+1;}void MAX_HEAPIFY(int A[],int i,int size_heap)  //保持最大堆特性的函数调整函数,堆由数组实现{    int largest;    int l = LEFT(i);    int r = RIGHT(i);    if(l <= size_heap && A[l] > A[i])       largest = l;    else       largest = i;    if(r <= size_heap && A[r] > A[largest])       largest = r;    if(largest != i)    {        int temp = A[i];        A[i] = A[largest];        A[largest] = temp;        MAX_HEAPIFY(A,largest,size_heap);    }}void BUILD_MAXHEAP(int A[],int *size_heap,int len){    int i = 0;    *size_heap = len;    for(i = floor(len/2);i >= 1;i--)    {        MAX_HEAPIFY(A,i,*size_heap);    }}void HEAP_SORT(int A[],int length)     //先对A进行堆构造,然后对A的最大值进行兑换,{                                          //把A[1]放到最后,并且堆规模减一,表示把最后一个最大值从除去    int temp,i;    int size_heap;    BUILD_MAXHEAP(A,&size_heap,length);    for(i = size_heap;i > 1;i--)    {        temp = A[size_heap];        A[size_heap] = A[1];        A[1] = temp;        size_heap--;        MAX_HEAPIFY(A,1,size_heap);    }}int main(){    int A[11] = {0,1,5,7,3,8,9,2,4,20,34};    HEAP_SORT(A,10);    int i;    for(i = 1;i <= 10;i++)       printf("%d ",A[i]);    return 0;}