思路分析
package com.shujujiegou;
import java.util.Arrays;
public class ran {
public static void main(String[] args) {
//要求升序排列
int arr[]={4,6,8,5,9};
duipaixu(arr);
}
//编写一个堆排序的方法
public static void duipaixu(int arr[]){
int temp=0;
System.out.println("堆排序");
//构建为堆
for(int i=arr.length/2-1;i>=0;i--){
dadingdui(arr,i,arr.length);
}
//交换元素,使最大元素到最后
//重新调整结构,使其满足堆定义,
for(int j=arr.length-1;j>0;j--){
//交换
temp=arr[j];
arr[j]=arr[0];
arr[0]=temp;
dadingdui(arr,0,j);
}
System.out.println("shuzu="+Arrays.toString(arr));
}
//将一个数组(二叉树)调整成一个大顶堆,i表示非叶子节点在数组中的索引,length表示对多少个元素进行调整,是在逐渐减少
//将以i为非叶子节点的树调整成大堆栈 比方说i=1的时候 46859->49856
//如果我们再次调用,就应该传入i=0 49856->96854
public static void dadingdui(int arr[],int i,int length){
int temp=arr[i]; //先取出当前元素的值保存在临时变量
//开始调整
for (int k=i*2+1;k<length;k=k*2+1){
if(k+1<length && arr[k]<arr[k+1]) {
//左子节点小于右子节点
k++;
}
if(arr[k]>temp){
//如果子节点大于父节点
arr[i]=arr[k]; //吧较大的值赋给当前节点
i=k; //让i指向k,继续循环比较
}else {
break;
}
}
//当for循环结束后,我们已经将以i为父节点的树的最大值放在了堆顶(局部)
arr[i]=temp;//将temp值放到调整后的位置
}
}
//创建双向链表
class HeroNode{
public int no;
public HeroNode next;
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public HeroNode getNext() {
return next;
}
public void setNext(HeroNode next) {
this.next = next;
}
public HeroNode(int no) {
this.no = no;
}
}
代码实现效果如下: