码迷,mamicode.com
首页 > 编程语言 > 详细

排序算法-堆排序

时间:2020-05-10 19:07:12      阅读:68      评论:0      收藏:0      [点我收藏+]

标签:hal   rev   size   psi   时间   swift   复杂   mpi   nlogn   

堆排序(升序为例)

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

* 稳定性: 不稳定

排序算法-堆排序

标签:hal   rev   size   psi   时间   swift   复杂   mpi   nlogn   

原文地址:https://www.cnblogs.com/tzsh1007/p/12731420.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!