Add multi-language code blocks to heap.

pull/243/head
Yudong Jin 2 years ago
parent 56134d17e4
commit d1d2c429b7

@ -82,6 +82,54 @@ comments: true
minHeap = new PriorityQueue<>(Arrays.asList(1, 3, 2, 5, 4)); 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$ )即可,有兴趣的同学可自行实现。 下文实现的是「大顶堆」,若想转换为「小顶堆」,将所有大小逻辑判断取逆(例如将 $\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」。 给定元素 `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)$ 。 如果我们想要直接输入一个列表并将其建堆,那么该怎么做呢?最直接地,考虑使用「元素入堆」方法,将列表元素依次入堆。元素入堆的时间复杂度为 $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)$ - 完全二叉树中,设结点总数为 $n$ ,则叶结点数量为 $(n + 1) / 2$ ,其中 $/$ 为向下整除。因此在排除叶结点后,需要堆化结点数量为 $(n - 1)/2$ ,即为 $O(n)$

Loading…
Cancel
Save