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 13139 . 二分搜索,二分搜索优化
141410 . 二分搜索树,二分搜索树搜索、移除最大最小值
151511 . 集合 和 映射
16+ 12 . 堆
1617
1718#### SDK版本
18191 . 版本:2.12.3
You can’t perform that action at this time.
0 commit comments