堆排序满足完全二叉树的特性
若一棵二叉树至多只有最下面两层的结点的度数可以小于2,并且最下层的结点都集中在该层最左边的若干位置上,则此二叉树为完全二叉树。
class Heapsort{
int tem=0;
//函数结束完成以结点i为顶点的大顶堆
public void adjustnode(int []arr,int i,int length)
{
int tem=arr[i];
for(int k=2*i+1;k<length;k=2*i+1)
{
if((k+1)<length&&arr[k+1]>arr[k]) k++;//如果右子节点大于左子结点,指向右结点
if(arr[k]>tem)
{
arr[i]=arr[k]; //每次for循环都将节点i的左子结点和右子节点的最大值赋给结点i
i=k;
//下一次循环是节点是结点i的子结点所以i=k
//每次循环不知道下次是左结点还是右结点,则必须保证没有访问的子树为大堆序
}
else
break;
}
arr[i]=tem;
//将最大值赋值给传进来的节点
}
public void heapsort(int arr[]){
for(int j=arr.length/2-1;j>=0;j--)
{
adjustnode(arr,j,arr.length);
}
System.out.println(Arrays.toString(arr));
//arr.length/2为最后叶子结点序号,递减到根节点
//非叶子结点查找方向:从右到左,从下往上
//此函数是将整个数组成为大堆序
//adjustnode(arr,0,arr.length);
for(int j=arr.length-1;j>=0;j--)
{
tem=arr[j];
arr[j]=arr[0];
arr[0]=tem;
adjustnode(arr,0,j);
//传入长度j理解为需要排序的元素个数,即下标最大值
}
}
}