美文网首页
利用数组实现堆

利用数组实现堆

作者: 梁森的简书 | 来源:发表于2021-03-01 23:20 被阅读0次

成员变量

元素个数N
包含元素的数组items

方法

插入
删除

插入实现

1 将元素直接插入到最后一个元素(N),N从1开始
2 使用上浮,将最后一个元素上浮到合适位置

上浮实现

比较N处元素和其父节点的大小,如果大,则交换两者的位置,直到N处元素变为第1个元素

删除实现

1 将1处元素(根节点)和N处元素交换,同时将交换的N处元素置空
2 通过下沉,让1处元素处于合适位置

下沉

通过循环比较父节点和其左右子树的大小,如果父节点比其左右子树中较大者小,则交换两者位置,直到这个父节点没有左右子树

代码
/// 堆
class Heap {
    
    private var items = [String]()
    /// 堆中元素个数
    var N = 0
    
    init(capacity: Int) {
        for _ in 0..<capacity {
            items.append("")
        }
    }
    
    func printHeap() {
        for i in 0..<N {
            print("\(items[i])")
        }
    }
    
    /// i处元素是否比j处元素小
    private func less(i: Int, j: Int) -> Bool {
        if items[i].compare(items[j]) == .orderedAscending {
            return true
        } else {
            return false
        }
    }
    
    private func exchange(i: Int, j: Int) {
        let temp = items[i]
        items[i] = items[j]
        items[j] = temp
    }
    
    /// 插入元素
    func insert(t: String) {
        N = N + 1
        items[N] = t
        swim(k: N)
    }
    
    /// 上浮算法,让k处元素处于正确的位置
    private func swim(k: Int) {
        var i = k
        while i > 1 {
            if less(i: i/2, j: i) {
                exchange(i: i/2, j: i)
            }
            i = i / 2
        }
    }
    
    /// 删除最大元素
    func deleteMax() -> String {
        let maxItem = items[1]
        exchange(i: 1, j: N)
        items[N] = ""
        sink(k: 1)
        N = N - 1
        return maxItem
    }
    
    /// 下沉算法,让k处元素处于正确的位置
    private func sink(k: Int) {
        var i = k
        while 2*i <= N {
            var max = 2*i
            if 2*i+1 <= N {   // 如果有右子树
                if less(i: 2*i, j: 2*k+1) {
                    max = 2*i+1
                }
            }
            if !less(i: i, j: max) {
                break
            }
            exchange(i: i, j: max)
            i = max
        }
    }
}

demo地址:https://github.com/yangguanghei/studyDateStructure

相关文章

  • 利用数组实现堆

    成员变量 元素个数N包含元素的数组items 方法 插入删除 插入实现 1 将元素直接插入到最后一个元素(N),N...

  • Array集结号

    实现数组去重的几种方法 数组去重一 数组去重二 利用数组indexof+push实现数组去重 数组去重三 利用对象...

  • 堆排序

    堆排序算法利用堆的结构来执行快速排序。 为了实现从最低到最高排序,堆排序首先将未排序的数组转换为最大堆,以便数组中...

  • 数组flat实现

    利用数组的reduce和concat实现数组flat,并可传参

  • 小根堆的应用1

    思路:利用小根堆实现

  • 2018-09-10

    索引堆: 索引堆进行操作时,比较的是data数组,而交换的是index数组 从上面三幅图可以看出,利用索引堆进行排...

  • 课堂笔记

    上机作业: 1、利用一维数组,编程实现10个无序数的从小到大排序(选择法排序)。 2、利用二维数组实现,编程实现...

  • C语言实现常用数据结构:静态链表-数组实现(第5篇)

    静态链表 使用数组实现,利用数组下标代替指针,从而实现数据结点之间的先后关系。实现要点: 1.数组下标为0的位置为...

  • 数组堆化 Java 实现

    方法一,使用一个新的数组 方法二,原地堆化 在方法一的基础上再优化一下,改为原地排序 附:提供一个简单打印树结构数...

  • 排序算法之堆排序

    堆排序是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构(通常堆是通过一维数组来实现的),并...

网友评论

      本文标题:利用数组实现堆

      本文链接:https://www.haomeiwen.com/subject/vpbzfltx.html