java版資料結構與演算法—堆、堆排序
阿新 • • 發佈:2018-11-30
優先順序佇列:用有序陣列實現,刪除最大數最快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();
}
}