From d1d2c429b704faa7b5dcf2d1b3895d8860371648 Mon Sep 17 00:00:00 2001 From: Yudong Jin Date: Thu, 12 Jan 2023 04:19:59 +0800 Subject: [PATCH] Add multi-language code blocks to heap. --- docs/chapter_heap/heap.md | 288 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 288 insertions(+) diff --git a/docs/chapter_heap/heap.md b/docs/chapter_heap/heap.md index 37e5aaf6..73f425ff 100644 --- a/docs/chapter_heap/heap.md +++ b/docs/chapter_heap/heap.md @@ -82,6 +82,54 @@ comments: true minHeap = new PriorityQueue<>(Arrays.asList(1, 3, 2, 5, 4)); ``` +=== "C++" + + ```cpp title="heap.cpp" + + ``` + +=== "Python" + + ```python title="heap.py" + + ``` + +=== "Go" + + ```go title="heap.go" + + ``` + +=== "JavaScript" + + ```js title="heap.js" + + ``` + +=== "TypeScript" + + ```typescript title="heap.ts" + + ``` + +=== "C" + + ```c title="heap.c" + + ``` + +=== "C#" + + ```csharp title="heap.cs" + + ``` + +=== "Swift" + + ```swift title="heap.swift" + + ``` + ## 堆的实现 下文实现的是「大顶堆」,若想转换为「小顶堆」,将所有大小逻辑判断取逆(例如将 $\geq$ 替换为 $\leq$ )即可,有兴趣的同学可自行实现。 @@ -125,6 +173,54 @@ comments: true } ``` +=== "C++" + + ```cpp title="my_heap.cpp" + + ``` + +=== "Python" + + ```python title="my_heap.py" + + ``` + +=== "Go" + + ```go title="my_heap.go" + + ``` + +=== "JavaScript" + + ```js title="my_heap.js" + + ``` + +=== "TypeScript" + + ```typescript title="my_heap.ts" + + ``` + +=== "C" + + ```c title="my_heap.c" + + ``` + +=== "C#" + + ```csharp title="my_heap.cs" + + ``` + +=== "Swift" + + ```swift title="my_heap.swift" + + ``` + ### 访问堆顶元素 堆顶元素是二叉树的根结点,即列表首元素。 @@ -138,6 +234,54 @@ comments: true } ``` +=== "C++" + + ```cpp title="my_heap.cpp" + + ``` + +=== "Python" + + ```python title="my_heap.py" + + ``` + +=== "Go" + + ```go title="my_heap.go" + + ``` + +=== "JavaScript" + + ```js title="my_heap.js" + + ``` + +=== "TypeScript" + + ```typescript title="my_heap.ts" + + ``` + +=== "C" + + ```c title="my_heap.c" + + ``` + +=== "C#" + + ```csharp title="my_heap.cs" + + ``` + +=== "Swift" + + ```swift title="my_heap.swift" + + ``` + ### 元素入堆 给定元素 `val` ,我们先将其添加到堆底。添加后,由于 `val` 可能大于堆中其它元素,此时堆的成立条件可能已经被破坏,**因此需要修复从插入结点到根结点这条路径上的各个结点**,该操作被称为「堆化 Heapify」。 @@ -191,6 +335,54 @@ comments: true } ``` +=== "C++" + + ```cpp title="my_heap.cpp" + + ``` + +=== "Python" + + ```python title="my_heap.py" + + ``` + +=== "Go" + + ```go title="my_heap.go" + + ``` + +=== "JavaScript" + + ```js title="my_heap.js" + + ``` + +=== "TypeScript" + + ```typescript title="my_heap.ts" + + ``` + +=== "C" + + ```c title="my_heap.c" + + ``` + +=== "C#" + + ```csharp title="my_heap.cs" + + ``` + +=== "Swift" + + ```swift title="my_heap.swift" + + ``` + ### 堆顶元素出堆 堆顶元素是二叉树根结点,即列表首元素,如果我们直接将首元素从列表中删除,则二叉树中所有结点都会随之发生移位(索引发生变化),这样后续使用堆化修复就很麻烦了。为了尽量减少元素索引变动,采取以下操作步骤: @@ -270,6 +462,54 @@ comments: true } ``` +=== "C++" + + ```cpp title="my_heap.cpp" + + ``` + +=== "Python" + + ```python title="my_heap.py" + + ``` + +=== "Go" + + ```go title="my_heap.go" + + ``` + +=== "JavaScript" + + ```js title="my_heap.js" + + ``` + +=== "TypeScript" + + ```typescript title="my_heap.ts" + + ``` + +=== "C" + + ```c title="my_heap.c" + + ``` + +=== "C#" + + ```csharp title="my_heap.cs" + + ``` + +=== "Swift" + + ```swift title="my_heap.swift" + + ``` + ### 输入数据并建堆 * 如果我们想要直接输入一个列表并将其建堆,那么该怎么做呢?最直接地,考虑使用「元素入堆」方法,将列表元素依次入堆。元素入堆的时间复杂度为 $O(n)$ ,而平均长度为 $\frac{n}{2}$ ,因此该方法的总体时间复杂度为 $O(n \log n)$ 。 @@ -290,6 +530,54 @@ comments: true } ``` +=== "C++" + + ```cpp title="my_heap.cpp" + + ``` + +=== "Python" + + ```python title="my_heap.py" + + ``` + +=== "Go" + + ```go title="my_heap.go" + + ``` + +=== "JavaScript" + + ```js title="my_heap.js" + + ``` + +=== "TypeScript" + + ```typescript title="my_heap.ts" + + ``` + +=== "C" + + ```c title="my_heap.c" + + ``` + +=== "C#" + + ```csharp title="my_heap.cs" + + ``` + +=== "Swift" + + ```swift title="my_heap.swift" + + ``` + 那么,第二种建堆方法的时间复杂度时多少呢?我们来做一下简单推算。 - 完全二叉树中,设结点总数为 $n$ ,则叶结点数量为 $(n + 1) / 2$ ,其中 $/$ 为向下整除。因此在排除叶结点后,需要堆化结点数量为 $(n - 1)/2$ ,即为 $O(n)$ ;