#include <iostream>
using namespace std;
int Data[1001]; //下标从1开始计算,数组长度不包括下标0
void alter_heap(int T[], int n,int i, int v); //改变对的一个值
void sift_down(int T[],int n, int i);//向下移
void percolate(int T[],int n, int i);//向上移
int find_max(int T[], int n);
void make_heap(int T[], int n);//将一个数组变成堆
void heapsort(int T[], int n);//堆排序
void Onpaint(int T[], int n)
{
for(int i=1; i<=n;i++)
{
cout<< T[i]<<" ";
}
cout<<endl;
}
void Test()
{
int n =10;
Data[1] = 1;
Data[2] = 6;
Data[3] = 9;
Data[4] = 2;
Data[5] = 7;
Data[6] = 5;
Data[7] = 2;
Data[8] = 7;
Data[9] = 4;
Data[10] = 10;
cout<<"init:";
Onpaint(Data,10);
heapsort(Data,10);
Onpaint(Data,10);
}
int main()
{
Test();
return 0;
}
void heapsort(int T[], int n)//本质:堆当前的T[1] 是最大的,把它提出来,剩下的i-1个再组成个堆
{
make_heap(T, n);
cout<<"after make_heap:";
Onpaint(Data,10);
int tmp;
for(int i=n;i>=2;i--)
{
tmp = T[1];
T[1] = T[i];
T[i] = tmp;
sift_down(T,i-1,1);
}
}
void make_heap(int T[], int n) //有了堆的性质:字节点不大于根节点
{
for(int i = n/2; i>=1;i--)
{
sift_down(T,n,i);
}
}
void alter_heap(int T[],int n, int i, int v)
{
int tmp = T[i];
T[i] = v;
if(v<tmp)
{
sift_down(T,n,i);
}
else
{
percolate(T,n,i);
}
}
void sift_down(int T[],int n, int i)
{
int k= i;
int j ;
int tmp;
while(true) // 本质:找出字节点中最大的(当然还要大于当前节点)
{
j = k;
if((2*j)<=n && T[2*j]>T[k])
{
k = 2*j;
}
if((2*j)<n && T[2*j+1] > T[k]) //如果成立 此时T[2*j+1]是三个数中最大的
{
k =2*j+1;
}
if(k == j)
break;
tmp = T[j];
T[j] = T[k];
T[k] = tmp;
}
}
void percolate(int T[], int n,int i)
{
int k,j,tmp;
k = i;
while(true)
{
j = k;
if(j>1 && T[j/2] <T[k])
k=j/2;
if(k==j)
break;
tmp = T[j/2];
T[j/2] = T[k];
T[k] = tmp;
}
}
int find_max(int T[], int n)
{
if(n>=2)
return T[1];
return 0;
}