Skip to content

Commit e2fe49b

Browse files
author
tianqing.liang
committed
1 parent dc99331 commit e2fe49b

File tree

3 files changed

+127
-0
lines changed

3 files changed

+127
-0
lines changed

12-Heap/Main.dart

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import 'MaxHeap.dart';
2+
import 'dart:math';
3+
void main(){
4+
5+
int n = 100;
6+
7+
MaxHeap<num> maxHeap = new MaxHeap.withEmpty();
8+
Random random = new Random();
9+
10+
for(int i = 0 ; i < n ; i ++){
11+
maxHeap.add(random.nextInt(1<<32));
12+
}
13+
print(maxHeap);
14+
List arr = List.filled(n, num, growable: true);
15+
for(int i = 0 ; i < n ; i ++){
16+
arr[i] = maxHeap.extractMax();
17+
}
18+
print(arr);
19+
for(int i = 1 ; i < n ; i ++){
20+
if(arr[i-1] < arr[i]){
21+
throw new Exception("Error");
22+
}
23+
}
24+
25+
print("Test MaxHeap completed");
26+
27+
28+
29+
}

12-Heap/MaxHeap.dart

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
/**
2+
* 最大堆
3+
*/
4+
class MaxHeap<E extends Comparable<E>>{
5+
6+
List? data ;
7+
8+
MaxHeap.withCapacity(int capacity){
9+
data = List.filled(capacity, E, growable: true);
10+
}
11+
12+
MaxHeap.withEmpty(){
13+
data = List.empty(growable: true);
14+
}
15+
16+
// 返回堆中的元素个数
17+
int? size(){
18+
return data!.length;
19+
}
20+
21+
// 返回一个布尔值, 表示堆中是否为空
22+
bool isEmpty(){
23+
return data!.isEmpty;
24+
}
25+
26+
int _parent(int index){
27+
if(index == 0){
28+
throw Exception("index-0 doesn't have parent.");
29+
}
30+
return ((index - 1) / 2).toInt();
31+
}
32+
33+
// 返回完全二叉树的数组表示中,一个索引所表示的元素的左孩子节点的索引
34+
int _leftChild(int index){
35+
return index * 2 + 1;
36+
}
37+
38+
// 返回完全二叉树的数组表示中,一个索引所表示的元素的右孩子节点的索引
39+
int _rightChild(int index){
40+
return index * 2 + 2;
41+
}
42+
43+
// 向堆中添加元素
44+
add(E e){
45+
data!.add(e);
46+
siftUp(data!.length - 1);
47+
}
48+
49+
siftUp(int k){
50+
while(k > 0 && data![_parent(k)].compareTo(data![k]) < 0 ){
51+
_swap(k, _parent(k));
52+
k = _parent(k);
53+
}
54+
}
55+
56+
// 看堆中的最大元素
57+
E findMax(){
58+
if(data!.length == 0)
59+
throw new Exception("Can not findMax when heap is empty.");
60+
return data![0];
61+
}
62+
63+
// 取出堆中最大元素
64+
E extractMax(){
65+
66+
E ret = findMax();
67+
_swap(0, data!.length - 1);
68+
data!.removeLast();
69+
siftDown(0);
70+
71+
return ret;
72+
}
73+
74+
siftDown(int k){
75+
while(_leftChild(k) < data!.length){
76+
int j = _leftChild(k); // 在此轮循环中,data[k]和data[j]交换位置
77+
if( j + 1 < data!.length &&
78+
data![j+1].compareTo(data![j]) > 0 )
79+
j ++;
80+
// data[j] 是 leftChild 和 rightChild 中的最大值
81+
if(data![k].compareTo(data![j]) >= 0 )
82+
break;
83+
_swap(k, j);
84+
k = j;
85+
}
86+
}
87+
88+
_swap(int i, int j){
89+
if(i < 0 || i >= data!.length || j < 0 || j >= data!.length)
90+
throw new Exception("Index is illegal.");
91+
92+
E t = data![i];
93+
data![i] = data![j];
94+
data![j] = t;
95+
}
96+
97+
}

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
9. 二分搜索,二分搜索优化
1414
10. 二分搜索树,二分搜索树搜索、移除最大最小值
1515
11. 集合 和 映射
16+
12.
1617

1718
#### SDK版本
1819
1. 版本:2.12.3

0 commit comments

Comments
 (0)