特点 (1)堆是一种特殊的完全二叉树; (2)通过数组的方式顺序存储; (3)对于任意节点来说,满足根节点大于左右子树的值(大堆)或者满足根节点的值小于左右子树的值(小堆)作用:用来高效找出最值元素 典型问题:TopK问题向上调整与向下调整 (1)向下调整:是让调整的结点与其孩子节点进行比较 (2)向上调整:是让调整的结点与其父亲结点进行比较 若已知根节点的位置为index,则左子树的位置为2index+1; 右子树位置为2index+2; 若已知左子树的位置为leftIndex,则父节点的位置为(leftIndex-1)÷2;
public class TestHeap {
public void adjustDown(int[] array
,int size
,int index
){
while (true) {
int leftChild
= index
* 2 + 1;
if (leftChild
>= size
) {
return;
}
int minIndex
= leftChild
;
int rightChild
= leftChild
+ 1;
if (rightChild
< size
&& array
[rightChild
] < array
[leftChild
]) {
minIndex
= rightChild
;
}
if (array
[index
] <= array
[minIndex
]) {
break;
}
int tmp
= array
[index
];
array
[index
] = array
[minIndex
];
array
[minIndex
] = tmp
;
index
= minIndex
;
}
}
public void createHeap(int[] array
,int size
){
int lastIndex
= size
-1;
int lastParentIndex
= (size
-1-1)/2;
for (int i
= lastParentIndex
; i
>= 0 ; i
--) {
adjustDown(array
,size
,i
);
}
}
}
public class TestHeapP {
public void adjustUp(int[] array
,int size
,int index
){
while(true){
if (index
== 0){
break;
}
int parentIndex
= (index
-1)/2;
if (array
[parentIndex
] < array
[index
]){
break;
}
int tmp
= array
[parentIndex
];
array
[parentIndex
] = array
[index
];
array
[index
] = tmp
;
index
= parentIndex
;
}
}
public void createHeap(int[] array
,int size
){
int lastIndex
= size
-1;
int lastParentIndex
= (size
-1-1)/2;
for (int i
= lastParentIndex
; i
>= 0 ; i
--) {
adjustUp(array
,size
,i
);
}
}
}
优先队列的实现
public class MyPriorityQueue {
public int[] array
= new int[100];
public int size
= 0;
public void adjustUp(int[] array
,int size
,int index
){
while(true){
if (index
== 0){
break;
}
int parentIndex
= (index
-1)/2;
if (array
[parentIndex
] < array
[index
]){
break;
}
int tmp
= array
[parentIndex
];
array
[parentIndex
] = array
[index
];
array
[index
] = tmp
;
index
= parentIndex
;
}
}
public void offer(int x
){
array
[size
] = x
;
size
++;
adjustUp(array
,array
.length
,size
-1);
}
public void adjustDown(int[] array
,int size
,int index
){
while (true){
int leftChild
= index
*2+1;
if (leftChild
>= size
){
return;
}
int minIndex
= leftChild
;
int rightChild
= leftChild
+1;
if (rightChild
< size
&& array
[rightChild
] < array
[minIndex
]){
minIndex
= rightChild
;
}
if (array
[index
] < array
[minIndex
]){
break;
}
int tmp
= array
[minIndex
];
array
[minIndex
] = array
[index
];
array
[index
] = tmp
;
index
= minIndex
;
}
}
public Integer
poll(){
if (size
== 0){
return null
;
}
int ret
= array
[0];
array
[0] = array
[size
-1];
size
--;
adjustDown(array
,size
,0);
return ret
;
}
public Integer
peek(){
if (size
== 0){
return null
;
}
return array
[0];
}
public boolean isEmpty(){
return size
== 0;
}
}