堆排序

#include<stdio.h>

int left(int i) //返回做儿子下标
{
    return (i<<1)+1;
}

int right(int i) //返回右儿子下标
{
    return (i<<1)+2;
}

void maxheapify(int *A,int heapsize,int i) //维持最大堆性质
{
    int largest;
    int leftIdx = left(i);
    if(leftIdx<heapsize && A[i]<A[leftIdx])
    {
        largest = leftIdx;
    }
    else
    {
        largest = i;
    }
    int rightIdx = right(i);
    if(rightIdx<heapsize && A[largest]<A[rightIdx])
    {
        largest = rightIdx;
    }
    if(largest != i)
    {
        int temp = A[i];
        A[i] = A[largest];
        A[largest] = temp;
        maxheapify(A,heapsize,largest);
    }
}

void buildheap(int *A,int len) //建堆
{
    if(len==1 || len==0)
    {
        return;
    }
    for(int i=len/2-1;i>=0;i--)
    {
        maxheapify(A,len,i);
    }
}

void heapsort(int *A,int len) //排序
{
    buildheap(A,len);
    for(int i=len-1;i>0;i--)
    {
        int temp = A[i];
        A[i] = A[0];
        A[0] = temp;
        maxheapify(A,i,0);
    }
}

int main()
{
    int buf[]={2,4,1,5,7,4,6,8,10};
    int len = sizeof(buf)/sizeof(int);
    heapsort(buf,len);
    for(int i=0;i<len-1;i++)
    {
        printf("%d ",buf[i]);
    }
    printf("%d
",buf[len-1]);
    return 0;
}
原文地址:https://www.cnblogs.com/johnsblog/p/3929752.html