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

来源:互联网 发布:公司的网络架构 编辑:程序博客网 时间:2024/05/21 01:29

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

此例要实现的功能就是输入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=newScanner(System.in);
  intn=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--){ //从叶子节点开始向上调整
   intt,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){ //只有当根节点的编号发生改变时交换
     inttemp;
     temp=a[i];
     a[i]=a[t];
     a[t]=temp;
     i=t; //把左孩子或者右孩子的编号给i,继续执行while
   }
    elseflag=1; //否则跳出while循环
  }
  }
  for(int k=1;k
   System.out.print(a[k]+"");
  }
 }
}
 

原创粉丝点击