堆:
1.大顶堆:每个结点左右孩子都小于其父结点
2.小顶堆:每个结点左右孩子都大于其父结点
#include<stdio.h>
//交换数字
void swap(int* a,int* b)
{
int temp=*a;
*a=*b;
*b=temp;
}
//维护堆的性质 ---大顶堆
void heapify(int arr[],int n,int i)
{
int parent=i;
int l_child=2*i+1;
int r_child=2*i+2;
int largest=l_child;
if(r_child<n&&arr[l_child]<arr[r_child])
largest=r_child;
if(l_child<n&&arr[largest]>arr[parent])
{
swap(&arr[largest],&arr[parent]);
heapify(arr,n,largest);
}
}
//堆排序 heapsort
void heapsort(int arr[],int n)
{
for(int i=(n-1)/2;i>=0;i--)//开始下标为0
{
heapify(arr,n,i);
}//构建大顶堆
for(int i=n-1;i>=0;i--)
{
swap(&arr[0],&arr[i]);
heapify(arr,i,0);
}//排序
}
int main()
{
int arr[10]={7,5,6,1,2,8,4,2,69,85};
int n=10;
heapsort(arr,n);
for(int i=0;i<10;i++)
{
printf("%d ",arr[i]);
}
return 0;
}