原理
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构。堆说明
性质:完全二叉树或者是近似完全二叉树
分类:大根堆(父节点总是大于子节点)、小根堆(父节点总是小于子节点)
左右节点:无大小顺序- 步骤
1:对于给定的数据序列建堆
2:输出堆顶(首尾元素互相交换)
3:调整剩余元素,重建堆
4:重复2-3直到所有元素有序
性能
时间复杂度:由于每次调整堆的时间复杂度为O(logN),共N - 1次堆调整操作,再加上前面建立堆时N / 2次向下调整,每次调整时间复杂度也为O(logN)。两次次操作时间相加还是O(N * logN)。故堆排序的时间复杂度为O(N * logN)
空间负责度:O(1)实现
func adjust(arr []int, start, end int) {
tmp := arr[start]
i := 0
for i = 2*start + 1; i <= end; i *= 2 {
if i < end && arr[i] < arr[i+1] {
i++
} //保存左右孩子中较大值
if arr[i] > tmp {
arr[start] = arr[i]
start = i
} else {
break
}
}
arr[start] = tmp
}
func heapSort(arr []int) {
var tmp int
length := len(arr)
i := 0
for i = (length - 1 - 1) / 2; i >= 0; i-- {
adjust(arr, i, length-1)
}
for i = 0; i < length-1; i++ {
tmp = arr[0]
arr[0] = arr[length-1-i]
arr[length-1-i] = tmp
adjust(arr, 0, length-1-i-1)
}
}