堆排序算法的步骤:
首先将给定的无序数组排成一个大顶堆
交换大顶堆的首尾元素,然后删除尾部元素,将剩余元素再构建大顶堆,循环直到到达根节点。
若array[0,…,n-1]表示一颗完全二叉树的顺序存储模式,则双亲节点指针和孩子结点指针之间的内在关系如下:
任意一节点指针 i:父节点:i==0 ? null : (i-1)/2
左孩子:2*i + 1
右孩子:2*i + 2
代码:
public int[] sort(int[] arr) {
int len =arr.length;
if(len<1)
return arr;
help(arr,len);
while(len>0) {
int temp=arr[len-1];
arr[len-1]=arr[0];
arr[0]=temp;
gene(arr, 0,len-1);//交换大顶堆首尾,然后重建大顶堆
len--;
}
return arr;
}
public void help(int[] arr,int len) {
for(int i=len/2-1;i>=0;i--) {
gene(arr,i,len);
}
}
public void gene(int[] arr,int n,int len) {//主要功能根据给定的数组构建大顶堆
int maxindex =n;
//n*2+1左子节点
if(n*2+1<len && arr[n*2+1]>arr[maxindex]) {
maxindex=n*2+1;
}
if(n*2+2<len && arr[n*2+2]>arr[maxindex]) {
maxindex=n*2+2;
}
if(maxindex!=n) {
int temp=arr[maxindex];
arr[maxindex]=arr[n];
arr[n]=temp;
gene(arr,maxindex,len);//重要
}
}