自己写算法---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;
 }
}
时间: 2024-08-23 12:10:28

自己写算法---java的堆的非递归遍历的相关文章

Java非递归遍历树算法---以遍历文件为例

在网上看到的算法,跟之前自己写的一个非遍历算法类似,先记录下来. 非递归: import java.io.File; import java.util.LinkedList; public class FileSystem { public static void main(String[] args) { long a = System.currentTimeMillis(); LinkedList list = new LinkedList(); File dir = new File("c

数据结构二叉树的递归与非递归遍历之 实现可编译(1)java

前一段时间,学习数据结构的各种算法,概念不难理解,只是被C++的指针给弄的犯糊涂,于是用java,web,javascript,分别去实现数据结构的各种算法. 二叉树的遍历,本分享只是以二叉树中的先序遍历为例进行说明,中序遍历和后序遍历,以此类推! 二叉树递归与非递归遍历的区别,虽然递归遍历,跟容易读懂,代码量少,运算快,但是却容易出现溢出的问题,所以所以非递归遍历,在处理千万级的运算量时会先的很有用处. 二叉树的先序遍历:先访问根节点,再访问先后访问左右节点.如图: 二叉树的递归遍历之java

数据结构之二叉树篇卷三 -- 二叉树非递归遍历(With Java)

Nonrecursive Traversal of Binary Tree First I wanna talk about why should we use <code>Stack</code> to implement this algorithm. I think it is due to the FILO feature of Stack, and that really matters and makes sense when you get around with t

JAVA递归、非递归遍历二叉树(转)

原文链接: JAVA递归.非递归遍历二叉树 import java.util.Stack; import java.util.HashMap; public class BinTree { private char date; private BinTree lchild; private BinTree rchild; public BinTree(char c) { date = c; } // 先序遍历递归 public static void preOrder(BinTree t) {

二叉树的中序、先序、后序遍历非递归遍历算法(使用堆栈,用循环实现)

1 typedef struct TreeNode *BinTree; 2 typedef BinTree Position; 3 struct TreeNode{ 4 ElementType Data; 5 BinTree Left; 6 BinTree Right; 7 }; 8 BinTree BT; 9 void InOrderTraversal(BinTree BT)//中序遍历非递归遍历算法(使用堆栈,用循环实现) 10 { 11 BinTree T=BT; 12 Stack S=C

史上最简明易懂非递归遍历二叉树算法

巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozhuo) 遍历二叉树的递归函数是体现了算法之美的高妙算法,思路清晰,代码简洁,读之赏心悦目.代码例如以下: 程序代码: void PreOrderTraverse_R(BiTree BT)//採用递归方式先序遍历二叉树BT { if(BT != NULL) { printf("%c", BT->data);//输出该结点(根结点) PreOrderTraverse_R(BT->lchi

二叉树递归与非递归遍历,最近公共父节点算法

#include <iostream> #include <stack> using namespace std; #define MAX 100 //字符串最大长度 typedef struct Node //二叉树结点 { char data; Node *lchild,*rchild; } *Btree; void createBT(Btree &t); //先序构造二叉树 void preorder(Btree &t); //二叉树递归先序遍历 void i

Java实现二叉树的创建、递归/非递归遍历

近期复习数据结构中的二叉树的相关问题,在这里整理一下 这里包含: 1.二叉树的先序创建 2.二叉树的递归先序遍历 3.二叉树的非递归先序遍历 4.二叉树的递归中序遍历 5.二叉树的非递归中序遍历 6.二叉树的递归后序遍历 7.二叉树的非递归后序遍历 8.二叉树的层次遍历 这里感谢博客http://blog.csdn.net/skylinesky/article/details/6611442的指导 /**二叉树的结点定义*/ class Node<T>{ private T value; pr

先序遍历的非递归遍历算法

先序遍历的非递归遍历算法: 1 void InOrderTraversal(BinTree BT) 2 { 3 BinTree T=BT; 4 stack S=CreatStack(MaxSize)://创建并初始化堆栈S 5 while(T || !IsEmpty(S)){ 6 While(T){//一直向左并将沿途节点压入堆栈 7 printf("%5d",T->Data);//(访问)打印节点 8 Push(S,T); 9 T=T->left; 10 } 11 if(