#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;
}
堆排序
最新推荐文章于 2023-09-21 13:21:58 发布