算法学习第一课-----堆排序

堆:是一种特殊的完全二叉树,分为大根堆和小根堆,顾名思义,根节点的值比孩子结点的值大的就是大根堆,反之则为小根堆。

此例要实现的功能就是输入n个正整数,将其排列输出小根堆

eg.输入:

14
99 5 36 7 22 17 46 12 2 19 25 28 1 92

输出:1 2 17 5 19 28 46 12 7 22 25 99 36 92

代码:

package pat;
import java.util.Scanner;
public class ReadNum {
 public static void main(String[] args) {
  Scanner cin=new Scanner(System.in);
  int n=cin.nextInt(); //输入节点的个数
  int a[]=new int[n+1];
  
  for(int i=1;i<=n;i++){
   a[i]=cin.nextInt();  //按顺序保存节点到a数组
  }
  cin.close();
  int i;
  for(i=n/2;i>=1;i--){ //从叶子节点开始向上调整
   int t,flag=0;
   while(i*2<=n&&flag==0){ //有左孩子并且需要向上调整时
    if(a[i]>a[i*2]) //根节点大时把左孩子的编号赋给t
     t=2*i;
    else  //根节点小时把根结点的编号赋给t
     t=i;
    if(2*i+1<=n){ //当有有孩子并且根节点大于右孩子时把有孩子的编号赋给t
     if(a[t]>a[2*i+1])
      t=2*i+1;
    }
    if(t!=i){ //只有当根节点的编号发生改变时交换
     int temp;
     temp=a[i];
     a[i]=a[t];
     a[t]=temp;
     i=t; //把左孩子或者右孩子的编号给i,继续执行while
   }
    else flag=1; //否则跳出while循环
  }
  }
  for(int k=1;k
   System.out.print(a[k]+" ");
  }
 }
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值