Hello 算法 1.0.0b1 Swift版,我们先将其添加到堆底。添加后,由于 val 可能大于堆中其它元素,此时堆的成立条件可能已 经被破坏,因此需要修复从插入结点到根结点这条路径上的各个结点,该操作被称为「堆化 Heapify」。 考虑从入堆结点开始,从底至顶执行堆化。具体地,比较插入结点与其父结点的值,若插入结点更大则将它们 交换;并循环以上操作,从底至顶地修复堆中的各个结点;直至越过根结点时结束,或当遇到无需交换的结点 时提前结束。 Figure func siftUp(i: Int) { var i = i while true { // 获取结点 i 的父结点 let p = parent(i: i) // 当“越过根结点”或“结点无需修复”时,结束堆化 if p < 0 || maxHeap[i] <= maxHeap[p] { break } // 交换两结点 swap(i: i, j: p) // 循环向上堆化 i i = p } } 堆顶元素出堆 堆顶元素是二叉树根结点,即列表首元素,如果我们直接将首元素从列表中删除,则二叉树中所有结点都会随 之发生移位(索引发生变化),这样后续使用堆化修复就很麻烦了。为了尽量减少元素索引变动,采取以下操 作步骤: 1. 交换堆顶元素与堆底元素(即交换根结点与最右叶结点); 2. 交换完成后,将堆底从列表中删除(注意,因为已经交换,实际上删除的是原来的堆顶元素);0 码力 | 190 页 | 14.71 MB | 1 年前3
Hello 算法 1.0.0b2 Swift版,我们先将其添加到堆底。添加后,由于 val 可能大于堆中其它元素,此时堆的成立条件可能已 经被破坏,因此需要修复从插入结点到根结点这条路径上的各个结点,该操作被称为「堆化 Heapify」。 考虑从入堆结点开始,从底至顶执行堆化。具体地,比较插入结点与其父结点的值,若插入结点更大则将它们 交换;并循环以上操作,从底至顶地修复堆中的各个结点;直至越过根结点时结束,或当遇到无需交换的结点 时提前结束。 Figure func siftUp(i: Int) { var i = i while true { // 获取结点 i 的父结点 let p = parent(i: i) // 当“越过根结点”或“结点无需修复”时,结束堆化 if p < 0 || maxHeap[i] <= maxHeap[p] { break } // 交换两结点 swap(i: i, j: p) // 循环向上堆化 i i = p } } 堆顶元素出堆 堆顶元素是二叉树根结点,即列表首元素,如果我们直接将首元素从列表中删除,则二叉树中所有结点都会随 之发生移位(索引发生变化),这样后续使用堆化修复就很麻烦了。为了尽量减少元素索引变动,采取以下操 作步骤: 1. 交换堆顶元素与堆底元素(即交换根结点与最右叶结点); 2. 交换完成后,将堆底从列表中删除(注意,因为已经交换,实际上删除的是原来的堆顶元素);0 码力 | 199 页 | 15.72 MB | 1 年前3
Hello 算法 1.1.0 Swift版,我们首先将其添加到堆底。添加之后,由于 val 可能大于堆中其他元素,堆的成立条件可能 已被破坏,因此需要修复从插入节点到根节点的路径上的各个节点,这个操作被称为堆化(heapify)。 考虑从入堆节点开始,从底至顶执行堆化。如图 8‑3 所示,我们比较插入节点与其父节点的值,如果插入节 点更大,则将它们交换。然后继续执行此操作,从底至顶修复堆中的各个节点,直至越过根节点或遇到无须 交换的节点时结束。 第 8 章 堆 func siftUp(i: Int) { var i = i while true { // 获取节点 i 的父节点 let p = parent(i: i) // 当“越过根节点”或“节点无须修复”时,结束堆化 if p < 0 || maxHeap[i] <= maxHeap[p] { break } // 交换两节点 swap(i: i, j: p) // 循环向上堆化 i i = p } } 4. 堆顶元素出堆 堆顶元素是二叉树的根节点,即列表首元素。如果我们直接从列表中删除首元素,那么二叉树中所有节点的 索引都会发生变化,这将使得后续使用堆化进行修复变得困难。为了尽量减少元素索引的变动,我们采用以 下操作步骤。 1. 交换堆顶元素与堆底元素(交换根节点与最右叶节点)。 2. 交换完成后,将堆底从列表中删除(注意,由于已经交换,因此实际上删除的是原来的堆顶元素)。0 码力 | 379 页 | 18.47 MB | 1 年前3
Hello 算法 1.2.0 简体中文 Swift 版,我们首先将其添加到堆底。添加之后,由于 val 可能大于堆中其他元素,堆的成立条件可能 已被破坏,因此需要修复从插入节点到根节点的路径上的各个节点,这个操作被称为堆化(heapify)。 考虑从入堆节点开始,从底至顶执行堆化。如图 8‑3 所示,我们比较插入节点与其父节点的值,如果插入节 点更大,则将它们交换。然后继续执行此操作,从底至顶修复堆中的各个节点,直至越过根节点或遇到无须 交换的节点时结束。 第 8 章 堆 func siftUp(i: Int) { var i = i while true { // 获取节点 i 的父节点 let p = parent(i: i) // 当“越过根节点”或“节点无须修复”时,结束堆化 if p < 0 || maxHeap[i] <= maxHeap[p] { break } // 交换两节点 swap(i: i, j: p) // 循环向上堆化 i i = p } } 4. 堆顶元素出堆 堆顶元素是二叉树的根节点,即列表首元素。如果我们直接从列表中删除首元素,那么二叉树中所有节点的 索引都会发生变化,这将使得后续使用堆化进行修复变得困难。为了尽量减少元素索引的变动,我们采用以 下操作步骤。 1. 交换堆顶元素与堆底元素(交换根节点与最右叶节点)。 2. 交换完成后,将堆底从列表中删除(注意,由于已经交换,因此实际上删除的是原来的堆顶元素)。0 码力 | 379 页 | 18.48 MB | 10 月前3
Hello 算法 1.0.0b5 Swift版,我们首先将其添加到堆底。添加之后,由于 val 可能大于堆中其他元素,堆的成立条件可能 已被破坏。因此,需要修复从插入节点到根节点的路径上的各个节点,这个操作被称为「堆化 heapify」。 考虑从入堆节点开始,从底至顶执行堆化。如图 8‑3 所示,我们比较插入节点与其父节点的值,如果插入节 点更大,则将它们交换。然后继续执行此操作,从底至顶修复堆中的各个节点,直至越过根节点或遇到无须 交换的节点时结束。 第 8 章 堆 func siftUp(i: Int) { var i = i while true { // 获取节点 i 的父节点 let p = parent(i: i) // 当“越过根节点”或“节点无须修复”时,结束堆化 if p < 0 || maxHeap[i] <= maxHeap[p] { break } // 交换两节点 swap(i: i, j: p) 第 8 章 堆 hello‑algo 循环向上堆化 i = p } } 4. 堆顶元素出堆 堆顶元素是二叉树的根节点,即列表首元素。如果我们直接从列表中删除首元素,那么二叉树中所有节点的 索引都会发生变化,这将使得后续使用堆化修复变得困难。为了尽量减少元素索引的变动,我们采用以下操 作步骤。 1. 交换堆顶元素与堆底元素(即交换根节点与最右叶节点)。 2. 交换完成后,将堆底从列表中删除(注意,由于已经交换,实际上删除的是原来的堆顶元素)。0 码力 | 376 页 | 30.70 MB | 1 年前3
Hello 算法 1.0.0 Swift版,我们首先将其添加到堆底。添加之后,由于 val 可能大于堆中其他元素,堆的成立条件可能 已被破坏,因此需要修复从插入节点到根节点的路径上的各个节点,这个操作被称为「堆化 heapify」。 考虑从入堆节点开始,从底至顶执行堆化。如图 8‑3 所示,我们比较插入节点与其父节点的值,如果插入节 点更大,则将它们交换。然后继续执行此操作,从底至顶修复堆中的各个节点,直至越过根节点或遇到无须 交换的节点时结束。 第 8 章 堆 func siftUp(i: Int) { var i = i while true { // 获取节点 i 的父节点 let p = parent(i: i) // 当“越过根节点”或“节点无须修复”时,结束堆化 if p < 0 || maxHeap[i] <= maxHeap[p] { break } // 交换两节点 swap(i: i, j: p) 第 8 章 堆 hello‑algo 循环向上堆化 i = p } } 4. 堆顶元素出堆 堆顶元素是二叉树的根节点,即列表首元素。如果我们直接从列表中删除首元素,那么二叉树中所有节点的 索引都会发生变化,这将使得后续使用堆化进行修复变得困难。为了尽量减少元素索引的变动,我们采用以 下操作步骤。 1. 交换堆顶元素与堆底元素(交换根节点与最右叶节点)。 2. 交换完成后,将堆底从列表中删除(注意,由于已经交换,因此实际上删除的是原来的堆顶元素)。0 码力 | 378 页 | 17.59 MB | 1 年前3
共 6 条
- 1













