import java.io.*; import java.util.*; public class Main { public static void main(String args[]) { Scanner cin = new Scanner(System.in); //ArrayList<String> list = new ArrayList<String>(); //Scanner scan = new Scanner(System.in); //获取键盘输入的另一种格式 int[] list={}; //如果只是在外部申明而没有静态初始化的话,while里面的数组将变为局部变量,从而在循环外部无法获取 while(cin.hasNextInt()) { int s=cin.nextInt(); list = new int[s]; // 声明数组长度 for(int i=0;i<list.length;++i){ //给数组赋值 list[i] = cin.nextInt(); } break; } //以下是具体算法,堆排序(非递归) //1.初始化堆 list = confirm(list,list.length); //2.开始堆排序 for(int j=list.length-1;j>=0;--j){ int tmp=list[j]; list[j]=list[0]; list[0]=tmp; list = confirm(list,j); //最后一个不需要比较 } for(int i=0;i<list.length;++i){ System.out.println(list[i]); } } //初始化堆的方法 public static int[] init(int[] list,int cycnum){ for(int i=cycnum-1;i>=0;--i){ if(2*i+1>cycnum-1){ continue; //到最底层叶子节点时,跳出循环 } int max=0;//记录左右节点较大的一个,值的大小 int key=0;//记录key的大小 if(2*i+2>cycnum-1){ max=list[2*i+1]; key=2*i+1; }else{ max=list[2*i+1]>list[2*i+2] ? list[2*i+1]:list[2*i+2]; key=list[2*i+1]>list[2*i+2] ? 2*i+1 : 2*i+2; } if(max>list[i]){ list[key]=list[i]; list[i]=max; } } return list; } public static int[] confirm(int[] list,int cycnum){ for(int j=0;j<=cycnum;++j){ list = init(list,cycnum); //调用堆的方法,只是调用for循环,没有递归 if( list == init(list,cycnum)){ break; } } return list; } }