排序算法-堆排序
堆排序(升序为例)
思路:
1. 首先要建一个大顶堆
2. 交换堆顶元素与最后一个元素,堆的size - 1
3. 重复第二步,直至堆中只有元素一个
class HeapSort {
var array = [5, 7, 2, 8, 9, 4, 7, 3, 2]
var heapSize: Int!
init() {
heapSize = array.count
}
func sort() {
for i in (0 ... (heapSize >> 1) - 1).reversed() {
siftDown(index: i)
}
while heapSize > 1 {
heapSize -= 1
let tmp = array[0]
array[0] = array[heapSize]
array[heapSize] = tmp
siftDown(index: 0)
}
}
// 将数组转成堆
private func siftDown(index: Int) {
var tmpIndex = index
let ele = array[tmpIndex]
let half = heapSize >> 1
while tmpIndex < half {
var childIndex = (tmpIndex << 1) + 1;
var child = array[childIndex]
let rightIndex = childIndex + 1
if rightIndex < heapSize, array[rightIndex] > child {
childIndex = rightIndex
child = array[childIndex]
}
if ele >= child { break }
array[tmpIndex] = child
tmpIndex = childIndex
}
array[tmpIndex] = ele
}
}
* 最好、最坏、平均时间复杂度:O(nlogn)
* 空间复杂度: O(1)
* 稳定性: 不稳定