堆排序
利用完全二叉树实现最大堆;
//第一步:从最后端叶子结点开始,判断该节点与兄弟,孩子的关键字大小,将最大值移至父节点;循环至根节点,创建最大堆;
//第二步:将根节点与最后端节点换位,(除去最后节点),重复第一步,构建最大堆;
//第三步:重复第二步,直至根节点
//第四不:层序遍历输出;
private void InitalHeap(int [] assist)
{
assist=new int[a.length+1];
for(int i=1;i<=a.length;i++)
{
assist[i]=a[i-1];
}
}
private void CreatMaxHeap(int [] assist,int first,int last)
{
int rear=last;
if(last/2==0)//父节点只有一个孩子;
{
if(a[rear]>a[rear/2])
{
int exchang=a[rear];
a[rear]=a[rear/2];
a[rear/2]=exchang;
}
rear=rear-1;
}
else//父节点有两个孩子;
{
if(a[rear]>a[rear-1])
{
int exchang=a[rear];
a[rear]=a[rear-1];
a[rear-1]=exchang;
}
if(a[rear]>a[rear/2])
{
int exchang=a[rear];
a[rear]=a[rear/2];
a[rear/2]=exchang;
}
rear=rear-2;
}
while(rear>1)
{
if(a[rear]>a[rear-1])
{
int exchang=a[rear];
a[rear]=a[rear-1];
a[rear-1]=exchang;
}
if(a[rear]>a[rear/2])
{
int exchang=a[rear];
a[rear]=a[rear/2];
a[rear/2]=exchang;
}
rear=rear-2;
}
}
public void HeapSort()
{
InitalHeap(assist);
int i=1,j=assist.length;
while(j>i)
{
CreatMaxHeap(assist,1,j);
int exchang=assist[1];
assist[1]=assist[j];
assist[j]=exchang;
j--;
}
}