建立大堆,输出递增排序。建立一个大堆,第一个元素一定是最大的。建堆的时间是(log n),所以查找数组的最大值,用建堆的方法只用(log n)的时间。
#include<stdio.h>
void swap(int *a,int *b) //交换
{
int * c=0;
*c=*a;
*a=*b;
*b=*c;
}
void adjustHeap(int arr[],int n,int i) //核心,从数组的arr[i]调整堆次序,确保是大堆。
{
int j;
int temp=arr[i];
j=2*i+1;
while(j<n) //循环,调整的时候考虑对下层的影响
{
if(j+1<n&&(arr[j]<arr[j+1]))
j++;
if(arr[j]<=temp)
break;
arr[i]=arr[j];
i=j;
j=2*i+1;
}
arr[i]=temp;
}
void markHeap(int arr[],int n) //数组的后一半元素都是叶子,默认已经排好次序,所以从前一半的元素调整就可以了。
{
int i;
for(i=n/2-1;i>=0;--i)
adjustHeap(arr,n,i);
}
void sort(int arr[],int n)
{
int i;
for(i=n-1;i>0;--i)
{
swap(&arr[0],&arr[i]); //把第一个元素(最大的)和最后一个调整,实现排序
adjustHeap(arr,i,0);
}
}
int main()
{
int i=0;
int arr[]={111,5,3,78,45,1,0,-1,1121,2};
int size=sizeof(arr)/sizeof(int);
markHeap(arr,size);
printf("Heap=");
for(;i<size;i++)
printf ("%5d",arr[i]);
sort(arr,size);
printf("\nsort=");
for(i=0;i<size;i++)
printf ("%5d",arr[i]);
getch();
return 0;
}
堆的插入:
void insert(int a[],int i)
{
int j;
for(j=(i-1)/2;i>=1&&(a[i]>a[j]);i=j) //核心,从下到上的调整
swap(&a[i],&a[j]);
}
void add(int a[],int n,int value)
{
a[n]=value;
insert(a,n);
}