File tree Expand file tree Collapse file tree 3 files changed +127
-0
lines changed Expand file tree Collapse file tree 3 files changed +127
-0
lines changed Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change 13
13
9 . 二分搜索,二分搜索优化
14
14
10 . 二分搜索树,二分搜索树搜索、移除最大最小值
15
15
11 . 集合 和 映射
16
+ 12 . 堆
16
17
17
18
#### SDK版本
18
19
1 . 版本:2.12.3
You can’t perform that action at this time.
0 commit comments