java 实现构造最大堆

来源:互联网 发布:最新java培训视频教程 编辑:程序博客网 时间:2024/05/22 09:07

首先,我们得知道构造一个堆的时间复杂度是O(N),具体理由?
这里写图片描述
我认为这本书写的很详细,所以我直接拍了下来。。
附带:这本书是算法设计与分析(Python) 程振波老师写的。。。还没发行,,找到不少小BUG。。2333
那么我们直接用代码去实现下
题目是给定数列0 1 2 3 4 5 6 7 8 9求出其堆形状
方法从下往上依次堆化,时间复杂度O(n)

import java.util.ArrayList;import java.util.List;public class MaxHeap {    static void maxHeapify(List<Integer> list,int i)    {        if((i*2+1)<list.size())//存在子节点        {            int currectMax=maxChile(list,i);//找到当前节点与子节点中最大的节点            if(list.get(i)<list.get(currectMax))//将当前节点于最大值交换            {                int temp=list.get(i);                list.set(i,list.get(currectMax));                list.set(currectMax,temp);                maxHeapify(list, currectMax);//递归调用,继续处理最大节点,mc            }        }    }    static int maxChile(List<Integer> list,int i)    {        int leftchild=i*2+1,rightchild=i*2+2,largest=i;        if(leftchild<list.size()&&list.get(leftchild)>list.get(i))        {            largest=leftchild;        }        if(rightchild<list.size()&&list.get(rightchild)>list.get(largest))        {            largest=rightchild;        }        return largest;    }    static void buildHeap(List<Integer> list)    {        int mid=list.size()/2;  //得到第一个叶子节点的索引        for(int i=mid;i>=0;i--)        {            maxHeapify(list,i);//调用堆化函数        }    }    public static void main(String[] args)    {        List<Integer> list=new ArrayList();        for(int i=0;i<10;i++)            list.add(i);        buildHeap(list);        String space="";        int temp=(int) (Math.log(10)/Math.log(2));        int end=(int) (temp==Math.pow(2,temp)?temp:Math.pow(2,temp))-1;        for(int i=0;i<end;i++)        {            space+=' ';        }        System.out.println(space+list.get(0));        for(int k=1,i=1;k<10;i++)        {            space=space.substring(0,space.length()-2);            System.out.print(space);            for(int j=1;k<10&&j<=i*2;j++,k++)            {                System.out.print(list.get(k)+" ");            }            System.out.println();        }    }}

这里写图片描述

1 0