This commit is contained in:
krahets
2023-06-02 01:35:02 +08:00
parent 8cf488bed2
commit 874e75d92d
17 changed files with 228 additions and 18 deletions

View File

@@ -254,9 +254,41 @@ comments: true
=== "C#"
```csharp title="heap_sort.cs"
[class]{heap_sort}-[func]{siftDown}
/* 堆的长度为 n ,从节点 i 开始,从顶至底堆化 */
void siftDown(int[] nums, int n, int i) {
while (true) {
// 判断节点 i, l, r 中值最大的节点,记为 ma
int l = 2 * i + 1;
int r = 2 * i + 2;
int ma = i;
if (l < n && nums[l] > nums[ma])
ma = l;
if (r < n && nums[r] > nums[ma])
ma = r;
// 若节点 i 最大或索引 l, r 越界,则无需继续堆化,跳出
if (ma == i)
break;
// 交换两节点
(nums[ma], nums[i]) = (nums[i], nums[ma]);
// 循环向下堆化
i = ma;
}
}
[class]{heap_sort}-[func]{heapSort}
/* 堆排序 */
void heapSort(int[] nums) {
// 建堆操作:堆化除叶节点以外的其他所有节点
for (int i = nums.Length / 2 - 1; i >= 0; i--) {
siftDown(nums, nums.Length, i);
}
// 从堆中提取最大元素,循环 n-1 轮
for (int i = nums.Length - 1; i > 0; i--) {
// 交换根节点与最右叶节点(即交换首元素与尾元素)
(nums[i], nums[0]) = (nums[0], nums[i]);
// 以根节点为起点,从顶至底进行堆化
siftDown(nums, i, 0);
}
}
```
=== "Swift"

11
chapter_sorting/index.md Normal file
View File

@@ -0,0 +1,11 @@
---
comments: true
---
# 11. &nbsp; 排序
<div class="center-table" markdown>
![排序](../assets/covers/chapter_sorting.jpg){ width="70%" }
</div>

View File

@@ -152,7 +152,21 @@ comments: true
=== "C#"
```csharp title="selection_sort.cs"
[class]{selection_sort}-[func]{selectionSort}
/* 选择排序 */
void selectionSort(int[] nums) {
int n = nums.Length;
// 外循环:未排序区间为 [i, n-1]
for (int i = 0; i < n - 1; i++) {
// 内循环:找到未排序区间内的最小元素
int k = i;
for (int j = i + 1; j < n; j++) {
if (nums[j] < nums[k])
k = j; // 记录最小元素的索引
}
// 将该最小元素与未排序区间的首个元素交换
(nums[k], nums[i]) = (nums[i], nums[k]);
}
}
```
=== "Swift"