public class Heap {
public static void main(String[] args) {
int a[] = new int[]{5,6,8,4,2,3};
headsort(a);
}
public static void Buidheap(int a[],int len){
// i=0-【len/2】 二叉树的非叶子节点进行堆的调整
for (int i = len/2; i >= 0; i--) {
heapfy(a,i,len);
}
}
public static void heapfy(int a[],int k,int len){
int temp = a[k];//temp存放子树的根节点
//调整k节点为根的子树
for (int i = 2 * k+1; i < len ; i = i * 2 + 1 ) {
if(i < len-1 && a[i] < a[i+1]){
i++;//记录左右左孩子中最大数所在的节点位置
}
if(a[i] <= temp){//根节点最大,不用调整了
break;
}
else {//孩子的值比根节点的大,最大的孩子放到根节点
a[k]=a[i];
k=i;//对最大的孩子为根节点的子树进行调整
}
a[k]=temp;//确定根节点数据最终该放置的位置
}
}
public static void headsort(int a[]){
int len = a.length;
Buidheap(a,len);//建堆
int temp=0;
//将跟堆进行排序
for (int i = len; i > 1; i--) {
temp = a[0];
a[0] = a[i-1];
a[i-1] = temp;
heapfy(a,0,i-1);
}
//输出数组数据
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]+" ");
}
}
}
迭代实现堆排序-Java代码
最新推荐文章于 2024-10-18 13:02:57 发布