a simple Heap implementation~

Heap seems  sophisticated but the implementation is not very difficult. i think it is attrtibuted to its linear structure~

Besides, heap is very useful~

1 // Heap.cpp : 定义控制台应用程序的入口点。
2  //
3  
4 #include "stdafx.h"
5 #include <iostream>
6 #include <vector>
7 #include <stack>
8 #include <math.h>
9 using namespace std;
10
11 inline int LeftChild ( int father )
12 {
13 return (father+1)*2-1;
14 }
15
16 inline int RightChild ( int father )
17 {
18 return (father+1)*2;
19 }
20
21 inline int Father ( int child )
22 {
23 return (child-1)/2;
24 }
25
26 void swap ( int &a , int &b )
27 {
28 a = a+b;
29 b = a-b;
30 a = a-b;
31 }
32
33
34 class Heap
35 {
36 public:
37 Heap(){};
38 Heap( vector <int> v ) : element ( v )
39 {
40 for ( int i = Father( element.size()-1 ) ; i >= 0 ; i-- )
41 {
42 PercolateDown ( i );
43 }
44 }
45 ~Heap(){};
46
47 void PercolateDown ( int i )
48 {
49 while ( LeftChild ( i ) < ( int )element.size() && i>=0 )
50 {
51 int smallest = i;
52 if ( element [ LeftChild ( i ) ] < element [ smallest ] )
53 {
54 smallest = LeftChild ( i );
55 }
56
57 if ( RightChild ( i ) < ( int )element.size() )
58 {
59 if( element [ RightChild ( i ) ] < element [ smallest ] )
60 {
61 smallest = RightChild ( i );
62 }
63 }
64 if ( smallest != i)
65 {
66 swap ( element [ i ] , element [ smallest ] );
67 i = smallest;
68 }
69 else
70 break;
71 }
72 }
73
74 vector < int > element;
75
76 void Insert ( int n )
77 {
78 element.push_back ( n );
79 for ( int i = element.size()-1 ; element [ Father ( i ) ] > n ; i = Father ( i ) )
80 {
81 swap ( element [ i ] , element [ Father ( i ) ] );
82 }
83 }
84 int DeleteMin ()
85 {
86 int min = 0;
87 if ( !element.empty() )
88 {
89 min = element [ 0 ];
90 element [ 0 ] = element [ element.size()-1 ];
91 int SmallerChild = 0;
92
93 element.pop_back();
94
95 for ( int i = 0 ; LeftChild ( i ) < (int)element.size() ; i = SmallerChild)
96 {
97 SmallerChild = LeftChild ( i );
98 if( RightChild ( i ) < (int)element.size() )
99 {
100 if ( element [ LeftChild ( i ) ] > element [ RightChild ( i ) ] )
101 {
102 SmallerChild = RightChild ( i );
103 }
104 }
105
106 if ( element [ i ] > element [ SmallerChild ] )
107 {
108 swap ( element [ i ] , element [ SmallerChild ] );
109 }
110 else
111 break;
112 }
113 }
114 return min;
115 }
116
117 void Print ()
118 {
119 if ( element.size() != 0 )
120 {
121 stack < int > toprint;
122 toprint.push( 0 );
123 int maxdepth = ( int )( log ( ( double )element.size() ) / log ( ( double )2 ) );
124
125 vector < int > childrennum ( maxdepth + 1 , 0 );
126 childrennum [ 0 ] = 1;
127 while ( !toprint.empty() )
128 {
129 int tmp = toprint.top();
130 int depth = ( int )( log ( ( double )( tmp + 1 ) ) / log ( (double)2 ) );
131 toprint.pop();
132
133 for ( int i = 1 ; i <= 2*depth ; i++ )
134 {
135 if ( ( i/2 )*2 == i )
136 {
137 if ( childrennum [ ( i/2 ) ] > 0 )
138 {
139 cout << '|';
140 }
141 else
142 {
143 cout << ' ';
144 }
145 }
146 else
147 {
148 cout << ' ';
149 }
150 }
151 cout << '_' << element [ tmp ] << endl;
152 childrennum [ depth ] --;
153
154 if ( LeftChild ( tmp ) < ( int )element.size() )
155 {
156 childrennum [ depth+1 ]++;
157 toprint.push ( LeftChild ( tmp ) );
158 }
159 if ( RightChild ( tmp ) < ( int )element.size() )
160 {
161 childrennum [ depth+1 ]++;
162 toprint.push ( RightChild ( tmp ) );
163 }
164 }
165 }
166 }
167 };
168
169
170
171
172
173 int _tmain(int argc, _TCHAR* argv[])
174 {
175
176 vector < int > initial;
177 for ( int i = 0 ; i < 10 ; i ++ )
178 {
179 initial.push_back( rand()%100 );
180 }
181 Heap p ( initial );
182 for ( int i = 0 ; i < 10 ; i ++ )
183 {
184 p.Print();
185 p.DeleteMin();
186 getchar ();
187 }
188
189 return 0;
190 }
191
192
原文地址:https://www.cnblogs.com/kking/p/1848277.html