1. 程式人生 > >java版資料結構與演算法—堆、堆排序

java版資料結構與演算法—堆、堆排序

優先順序佇列:用有序陣列實現,刪除最大數最快O(1),插入最慢
用堆實現優先順序佇列,插入和刪除都很快O(logN)
堆:是一種樹,一種特殊的二叉樹
特點:
1.他是完全的二叉樹,除了樹的最後一層節點不需要是滿的,其他一層從左到右都是滿的。
2.它常常用一個數組實現。
3.堆中每一個節點都滿足堆的條件,父節點的關鍵字要大於所有子節點。
堆是弱序,(接近沒有排序,不支援遍歷),最大好處,快速移除最大節點,快速插入一個新節點。做優先順序佇列很合適。

package com.zoujc.heap;

/**
 * 堆排序
 */
public class Node {
    private
int iData; public Node(int key){ iData = key; } public int getKey(){ return iData; } public void setKey(int id){ iData = id; } } class Heap{ private Node[] heapArray; private int maxSize; private int currentSize; public Heap(int mx){ maxSize =
mx; currentSize = 0; heapArray = new Node[maxSize]; } public boolean isEmpty(){ return currentSize == 0; } public void insertAt(int index,Node newNode){ heapArray[index] = newNode; } public void incrementSize(){ currentSize ++; } public
Node remove(){ Node root = heapArray[0]; heapArray[0] = heapArray[--currentSize]; trickleDown(0); //向下調整 return root; } //向下調整 public void trickleDown(int index){ int largerChild; Node top = heapArray[index]; while (index < currentSize/2){ int leftChild = 2*index+1; int rightChild = leftChild + 1; if(rightChild < currentSize && heapArray[leftChild].getKey()<heapArray[rightChild].getKey()){ largerChild = rightChild; }else { largerChild = leftChild; } if(top.getKey() >= heapArray[largerChild].getKey()){ break; } heapArray[index] = heapArray[largerChild]; index = largerChild; } heapArray[index] = top; } //樹狀顯示 public void displyHeap(){ int nBlanks = 32; int itemsPerRow = 1; int column = 0; int j = 0; String dots = "··················"; System.out.println(dots + dots); while (currentSize > 0){ if(column == 0){ for(int k=0;k<nBlanks;k++){ System.out.print(" "); } } System.out.print(heapArray[j].getKey()); if(++j == currentSize){ break;//顯示完畢 } if(++column == itemsPerRow){ nBlanks/=2; itemsPerRow*=2; column = 0; System.out.println(); }else { for(int k = 0;k<nBlanks*2-2;k++){ System.out.print(" "); } } } System.out.println("\n"+dots+dots); } //按陣列方式顯示 public void displayArray(){ for(int j = 0;j<maxSize;j++){ System.out.print(heapArray[j].getKey() + " "); } System.out.println(); } }