Skip to content

Commit 1f93c2d

Browse files
authored
feat: add heap sort in golang (doocs#811)
1 parent 9d863bd commit 1f93c2d

File tree

2 files changed

+106
-0
lines changed

2 files changed

+106
-0
lines changed

basic/sorting/HeapSort/Main.go

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
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+
}

basic/sorting/HeapSort/README.md

+55
Original file line numberDiff line numberDiff line change
@@ -224,4 +224,59 @@ fn main() -> io::Result<()> {
224224
}
225225
```
226226

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+
227282
<!-- tabs:end -->

0 commit comments

Comments
 (0)