用数组存完全二叉树
最大堆:父节点大于孩子的值,左右孩子间无大小关系
void buildheap(type* &arr,int n);//从下向上调用heapify
void heapify(type* &arr,int i,int n);//恢复堆秩序,假设arr【i】以下是有序堆,只有arr【i]不符合堆的性质,让arr【i]逐级下降
void heapsort(type* &arr,int n);//把堆中数据变成数组的线性结构
void insert(type * &arr,int n,type key);
template <class type>
void heapify(type* &arr,int i,int n)
{
int left=2*i;
int right=2*i+1;
int largest=i;
if(left<n&&arr[largest]<arr[left])
largest=left;
if(right<n&&arr[largest]<arr[right])//use else if is wrong
{
largest=right;
}
if(largest!=i)
{
coordinate temp=arr[largest];
arr[largest]=arr[i];
arr[i]=temp;
heapify(arr,largest,n);
}
}
template <class type>
void buildheap(type* &arr,int n)
{
for(int i=n/2;i>=0;i--)
{
heapify(arr,i,n);
}
for(int i=0;i<n;i++)
{
cout<<arr[i];
}
}
template <class type>
void heapsort(type* &arr,int n)
{
buildheap(arr,n);
for(int i=n-1;i>=1;i--)
{
coordinate temp;
temp=arr[i];
arr[i]=arr[0];
arr[0]=temp;
n=n-1;
heapify(arr,0,n);
}
}
template <class type>
void insert(type * &arr,int n,type key)
{
coordinate temp;
int i=n;
while(i>0&&arr[i/2]<key)
{
arr[i]=arr[i/2];
i=i/2;
}
arr[i]=key;
}``