堆排序。时间复杂度O()。空间复杂度O(1)。原地排序。非稳定排序。
代码如下(已在leetcode提交通过)。题目链接
func sortArray(nums []int) []int {
l := len(nums)
if l < 2 {
return nums
}
end := l-1
// 整体堆化
for i := (end-1)/2; i >= 0; i-- {
heapify(nums, i, end)
}
// 排序
for i := end; i > 0; i-- {
nums[0], nums[i] = nums[i], nums[0]
heapify(nums, 0, i-1)
}
return nums
}
// 堆化
func heapify(a []int, b, e int) {
var (
p = b
pv = a[p]
)
for {
child := 2*p+1
if child > e {
break
}
if child+1 <= e && a[child+1] > a[child] {
child++
}
if pv >= a[child] {
break
}
a[p] = a[child]
p = child
}
a[p] = pv
}