数据结构 | 插入元素 | 删除最大元素 |
有序数组 | N | 1 |
无序数组 | 1 | N |
堆 | logN | logN |
理想情况 | 1 | 1 |
位置 k | 父结点位置 | 两子结点位置 |
根节点从1开始 | k/2 | 2k,2k+1 |
根节点从0开始 | (k-1)/2 | 2k+1,2k+2 |
private void swim(int n) {
// 第一层 父节点小于子节点
while (n > 1 && less(n / 2, n)) {
exch(n / 2, 2);
//n=父节点
n = n / 2;
}
}
private void sink(int k){
//子节点小于等于最后一个
while(2 * k <= N){
int j = 2 * k;
if(j <N && less(j,j + 1))j ++;//如果第二个子节点大,就取大的
if(!less(k,j))break;//跟父节点比对,父节点大就break;
exch(k,j);//交换后 k = j 继续下沉
k = j;
}
}
public class MaxPQ<T extends Comparable<T>> {
private boolean less(int i, int j) {
return pq.compareTo(pq[j]) < 0;
}
private void exch(int i, int j) {
T t = pq;
pq = pq[j];
pq[j] = t;
}
private T[] pq;
private int N = 0; //存放到[1-N]中 0没使用
public MaxPQ(int maxN) {
pq = (T[]) new Comparable[maxN + 1];
}
public boolean isEmpty() {
return N == 0;
}
public int size() {
return N;
}
public T delMax() {
T max = pq[1];
exch(1, N--);
pq[N + 1] = null;//防止对象游离态
//下沉
sink(1);
return max;
}
private void sink(int i) {
while (2 * i <= N) {
int j = 2 * i;
if (j < N && less(j, j + 1)) {
j++;
}
if (!less(i, j)) {
break;
}
exch(i, j);
i = j;
}
}
public void insert(T n) {
pq[++N] = n;
//上浮
swim(N);
}
private void swim(int n) {
while (n > 1 && less(n / 2, n)) {
exch(n / 2, 2);
n = n / 2;
}
}
}
public static void sort(Comparable[] a) {
int N = a.length - 1;//一共有N个 元素
/**
* 初始化堆
*/
for (int i = (N - 1) / 2; i >= 0; i--) {
sink(a, i, N);
}
/**
* 现在堆有序状态
*/
while (N >= 0) {
exch(a, 0, N--);
sink(a, 0, N);
}
}
public static void sink(Comparable[] a, int k, int n) {
while (2 * k + 1 <= n) {
int j = 2 * k + 1;
if (j < n && less(a, j, j + 1)) {
j++;
}
if (!less(a, k, j)) {
break;
}
exch(a, j, k);
k = j;
}
}
public static boolean less(Comparable[] a, int j, int i) {
return a[j].compareTo(a) < 0;
}
11.jpg (18.37 KB, 下载次数: 10)
12.jpg (13.19 KB, 下载次数: 12)
29.jpg (10.09 KB, 下载次数: 23)
31.jpg (9.6 KB, 下载次数: 10)
32.jpg (24.98 KB, 下载次数: 15)
10.jpg (23.74 KB, 下载次数: 44)
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |