-
Notifications
You must be signed in to change notification settings - Fork 44
/
HeapSort.go
92 lines (83 loc) · 2.12 KB
/
HeapSort.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
// HeapSort
/*
------------------------------------------------------
作者 : Black Ghost
日期 : 2019-03-06
版本 : 0.0.0
------------------------------------------------------
堆排序法
理论:
时间复杂度: O(nlog2(n))
最好情况 : O(nlog2(n))
最坏情况 : O(nlog2(n))
空间复杂度: O(1)
稳定性 : 不稳定
------------------------------------------------------
输入 :
in 输入矩阵, 1xn
输出 :
sol 排序结果
err 解出标志:false-未解出或达到步数上限;
true-全部解出
------------------------------------------------------
*/
package goNum
// heapSort_maxHeap 建立最大顶堆
func heapSort_maxHeap(sol *Matrix, n *int) {
for i := *n / 2; i >= 0; i-- {
heapSort_heapify(sol, i, n)
}
}
// heapSort_heapify 堆调整
func heapSort_heapify(sol *Matrix, i int, n *int) {
i0 := 2*i + 1
i2 := 2*i + 2
max := i
if i0 < *n && (*sol).Data[i0] > (*sol).Data[i] {
max = i0
}
if i2 < *n && (*sol).Data[i2] > (*sol).Data[i] {
max = i2
}
if max != i {
(*sol).Data[i], (*sol).Data[max] = (*sol).Data[max], (*sol).Data[i]
heapSort_heapify(sol, max, n)
}
}
// HeapSort 堆排序法
func HeapSort(in Matrix) (Matrix, bool) {
/*
堆排序法
输入 :
in 输入矩阵, 1xn
输出 :
sol 排序结果
err 解出标志:false-未解出或达到步数上限;
true-全部解出
*/
//判断初值维数
if in.Rows != 1 {
panic("Error in goNum.HeapSort: Input Matrix error")
}
if in.Columns < 1 {
panic("Error in goNum.HeapSort: Empty input Matrix")
} else if in.Columns == 1 {
return in, true
}
n := in.Columns
sol := ZeroMatrix(1, n)
var err bool = false
//初始化sol
for i := 0; i < n; i++ {
sol.Data[i] = in.Data[i]
}
//排序开始
heapSort_maxHeap(&sol, &n)
for i := in.Columns - 1; i > 0; i-- {
sol.Data[0], sol.Data[i] = sol.Data[i], sol.Data[0]
n--
heapSort_heapify(&sol, 0, &n)
}
err = true
return sol, err
}