java 實現構造最大堆

首先,我們得知道構造一個堆的時間複雜度是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();
        }
    }
}

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章