排序算法-堆排序

Posted tzsh1007

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序算法-堆排序相关的知识,希望对你有一定的参考价值。

堆排序(升序为例)

思路:
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)

* 稳定性: 不稳定




以上是关于排序算法-堆排序的主要内容,如果未能解决你的问题,请参考以下文章

选择排序(简单选择排序堆排序的算法思想及代码实现)

堆排序算法的实现

7.2堆排序的代码分析(算法基础—排序算法)

算法-java代码实现堆排序

十大经典排序算法总结(堆排序)

『算法设计_伪代码』堆排序