1: 优先队列
不是先进先出,是按照冒个规则,出:
2: 堆排序
1: 建堆
2: 堆顶与最后一个节点调换,堆顶出堆,重新调整堆
小顶堆: 节点i< 2i(左孩子) && i< 2i+1 (右孩子)
建立堆:(递归)当前i节点 和i/2 比较 如果i小于i/2 交换
调整堆: 顶点开始 ,(去左右节点中最小的)比较 ,若 孩子节点小 继续递归
若 孩子节点大 退出 (因为本身已经是堆排序的)
package com.algorithm.common;
import java.util.Iterator;
import java.util.NoSuchElementException;
/**
* 堆排序的最小优先队列
* @author lijunqing
*/
public class MinPQ<Key> implements Iterable<Key> {
private Key[] pq;
private int N;
public MinPQ() {
this(1);
N=0;
}
public MinPQ(int initCapacity) {
pq=(Key[])new Object[initCapacity + 1];
N=0;
}
/**
* 插入一个节点
* @param key
*/
public void insert(Key key) {
if(N == pq.length - 1) {
resize(2 * pq.length);
}
N++;
pq[N]=key;
swim(N);
}
/**
* 堆顶和最后一个节点交互 堆顶出堆 从堆顶开始调整堆
* @return
*/
public Key delMin() {
exch(1, N);
Key min=pq[N];
pq[N]=null;
N--;
skin(1); // 调整堆
return min;
}
/**
* 从i节点开始调整堆
* @param i
*/
private void skin(int i) {
while(2 * i <= N) {
int k=2 * i;
if(k < N && greater(k, k + 1)) { // 比较右节点小 取右节点
k++;
}
if(greater(k, i)) { // 如果孩子节点大 不需要调整了
break;
}
exch(i, k);
i=k;
}
}
/**
* 递归交互子父节点
* @param i
*/
private void swim(int i) {
while(i > 1 && greater(i / 2, i)) {
exch(i, i / 2);
i=i / 2;
}
}
/**
* 交互节点值
* @param i
* @param j
*/
private void exch(int i, int j) {
Key temp=pq[i];
pq[i]=pq[j];
pq[j]=temp;
}
/**
* 子节点小于父节点 [key是带有compare的] 只能现在用的数字
* @param i
* @param i2
* @return
*/
private boolean greater(int i, int j) {
return ((Comparable<Key>)pq[i]).compareTo(pq[j]) > 0;
}
/**
* 重新申请空间
* @param capacity
*/
private void resize(int capacity) {
Key[] temp=(Key[])new Object[capacity];
for(int i=0; i < pq.length; i++) {
temp[i]=pq[i];
}
pq=temp;
}
public int size() {
return N;
}
public boolean isEmpty() {
if(N == 0) {
return true;
}
return false;
}
@Override
public Iterator<Key> iterator() {
return new HeapIterator();
}
private class HeapIterator implements Iterator<Key> {
// 重新建一个
private MinPQ<Key> copy;
public HeapIterator() {
copy=new MinPQ<Key>(size());
for(int i=1; i <= N; i++)
copy.insert(pq[i]);
}
public boolean hasNext() {
return !copy.isEmpty();
}
public void remove() {
throw new UnsupportedOperationException();
}
public Key next() {
if(!hasNext())
throw new NoSuchElementException();
return copy.delMin();
}
}
public static void main(String[] agrs) {
MinPQ<Integer> minPQ=new MinPQ<Integer>();
minPQ.insert(25);
minPQ.insert(6);
minPQ.insert(9);
minPQ.insert(10);
minPQ.insert(3);
minPQ.insert(23);
Iterator<Integer> m=minPQ.iterator();
while(m.hasNext()) {
System.out.println(m.next());
}
}
}
结果:
3
6
9
10
23
25