您的位置:首页 > 其它

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

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

此例要实现的功能就是输入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]+"
");

  }

 }

}

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: