• 自己写算法---java的堆的非递归遍历


    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;
     }
    }
  • 相关阅读:
    C语言I博客作业02
    C语言I博客作业06
    C语言I—2019秋作业第一周作业
    C语言I博客作业09
    C语言I博客作业07
    C语言I博客作业08
    利用 jrebel 热部署\远程调试\远程热部署 springboot项目 服务器上的代码
    java 双因素认证(2FA)TOTP demo
    java File读取文件始终不存在的问题分析
    exchange 2010 的两个错误
  • 原文地址:https://www.cnblogs.com/yuqiandoudou/p/4809662.html
Copyright © 2020-2023  润新知