File tree 2 files changed +106
-0
lines changed
2 files changed +106
-0
lines changed Original file line number Diff line number Diff line change
1
+ package main
2
+
3
+ import "fmt"
4
+
5
+ const N = 100010
6
+
7
+ var (
8
+ size int
9
+ h []int
10
+ )
11
+
12
+ func up (u int ) {
13
+ for u / 2 != 0 && h [u / 2 ] > h [u ] { // 父节点比当前结点小
14
+ h [u / 2 ], h [u ] = h [u ], h [u / 2 ] // 交换
15
+ u /= 2
16
+ }
17
+ }
18
+ func down (u int ) {
19
+ t := u // t 最小值
20
+ if u * 2 <= size && h [2 * u ] < h [t ] { // 左孩子存在且小于t
21
+ t = u * 2
22
+ }
23
+ if u * 2 + 1 <= size && h [2 * u + 1 ] < h [t ] { // 右孩子存在且小于t
24
+ t = 2 * u + 1
25
+ }
26
+ if u != t {
27
+ h [u ], h [t ] = h [t ], h [u ]
28
+ down (t ) // 递归处理
29
+ }
30
+ }
31
+ func main () {
32
+ var n , m int
33
+ h = make ([]int , N )
34
+ fmt .Scanf ("%d%d" , & n , & m )
35
+ // 创建一维数组1
36
+ for i := 1 ; i <= n ; i ++ {
37
+ fmt .Scanf ("%d" , & h [i ])
38
+ }
39
+ size = n
40
+ // 一维数组变为小根堆
41
+ for i := n / 2 ; i != 0 ; i -- {
42
+ down (i )
43
+ }
44
+
45
+ for ; m != 0 ; m -- {
46
+ fmt .Printf ("%d " , h [1 ])
47
+ h [1 ] = h [size ]
48
+ size --
49
+ down (1 )
50
+ }
51
+ }
Original file line number Diff line number Diff line change @@ -224,4 +224,59 @@ fn main() -> io::Result<()> {
224
224
}
225
225
```
226
226
227
+ ### ** Go**
228
+ ``` go
229
+ package main
230
+
231
+ import " fmt"
232
+
233
+ const N = 100010
234
+
235
+ var (
236
+ size int
237
+ h []int
238
+ )
239
+
240
+ func up (u int ) {
241
+ for u/2 != 0 && h[u/2 ] > h[u] { // 父节点比当前结点小
242
+ h[u/2 ], h[u] = h[u], h[u/2 ] // 交换
243
+ u /= 2
244
+ }
245
+ }
246
+ func down (u int ) {
247
+ t := u // t 最小值
248
+ if u*2 <= size && h[2 *u] < h[t] { // 左孩子存在且小于t
249
+ t = u * 2
250
+ }
251
+ if u*2 +1 <= size && h[2 *u+1 ] < h[t] { // 右孩子存在且小于t
252
+ t = 2 *u + 1
253
+ }
254
+ if u != t {
255
+ h[u], h[t] = h[t], h[u]
256
+ down (t) // 递归处理
257
+ }
258
+ }
259
+ func main () {
260
+ var n , m int
261
+ h = make ([]int , N)
262
+ fmt.Scanf (" %d%d " , &n, &m)
263
+ // 创建一维数组1
264
+ for i := 1 ; i <= n; i++ {
265
+ fmt.Scanf (" %d " , &h[i])
266
+ }
267
+ size = n
268
+ // 一维数组变为小根堆
269
+ for i := n / 2 ; i != 0 ; i-- {
270
+ down (i)
271
+ }
272
+
273
+ for ; m != 0 ; m-- {
274
+ fmt.Printf (" %d " , h[1 ])
275
+ h[1 ] = h[size]
276
+ size--
277
+ down (1 )
278
+ }
279
+ }
280
+ ```
281
+
227
282
<!-- tabs:end -->
You can’t perform that action at this time.
0 commit comments