Skip to content

Commit d484b08

Browse files
authored
Prepare 1.1.0 release (#1274)
* Update bucket_sort.c * Fix the comments in quick_sort.c * Update the announce badge * Sync zh and zh-hant versions * Update contributors list. * Sync zh and zh-hant versions. * Sync zh and zh-hant versions. * Update the contributors list * Update the version number
1 parent 16942df commit d484b08

File tree

43 files changed

+471
-115
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+471
-115
lines changed

codes/c/chapter_sorting/bucket_sort.c

+1-5
Original file line numberDiff line numberDiff line change
@@ -20,24 +20,20 @@ void bucketSort(float nums[], int n) {
2020
int k = n / 2; // 初始化 k = n/2 个桶
2121
int *sizes = malloc(k * sizeof(int)); // 记录每个桶的大小
2222
float **buckets = malloc(k * sizeof(float *)); // 动态数组的数组(桶)
23-
23+
// 为每个桶预分配足够的空间
2424
for (int i = 0; i < k; ++i) {
25-
// 为每个桶预分配足够的空间
2625
buckets[i] = (float *)malloc(n * sizeof(float));
2726
sizes[i] = 0;
2827
}
29-
3028
// 1. 将数组元素分配到各个桶中
3129
for (int i = 0; i < n; ++i) {
3230
int idx = (int)(nums[i] * k);
3331
buckets[idx][sizes[idx]++] = nums[i];
3432
}
35-
3633
// 2. 对各个桶执行排序
3734
for (int i = 0; i < k; ++i) {
3835
qsort(buckets[i], sizes[i], sizeof(float), compare);
3936
}
40-
4137
// 3. 合并排序后的桶
4238
int idx = 0;
4339
for (int i = 0; i < k; ++i) {

codes/c/chapter_sorting/quick_sort.c

+20-17
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,16 @@ void swap(int nums[], int i, int j) {
1313
nums[j] = tmp;
1414
}
1515

16-
/* 快速排序类 */
17-
// 快速排序类-哨兵划分
16+
/* 哨兵划分 */
1817
int partition(int nums[], int left, int right) {
1918
// 以 nums[left] 为基准数
2019
int i = left, j = right;
2120
while (i < j) {
2221
while (i < j && nums[j] >= nums[left]) {
23-
// 从右向左找首个小于基准数的元素
24-
j--;
22+
j--; // 从右向左找首个小于基准数的元素
2523
}
2624
while (i < j && nums[i] <= nums[left]) {
27-
// 从左向右找首个大于基准数的元素
28-
i++;
25+
i++; // 从左向右找首个大于基准数的元素
2926
}
3027
// 交换这两个元素
3128
swap(nums, i, j);
@@ -36,7 +33,7 @@ int partition(int nums[], int left, int right) {
3633
return i;
3734
}
3835

39-
// 快速排序类-快速排序
36+
/* 快速排序 */
4037
void quickSort(int nums[], int left, int right) {
4138
// 子数组长度为 1 时终止递归
4239
if (left >= right) {
@@ -49,8 +46,9 @@ void quickSort(int nums[], int left, int right) {
4946
quickSort(nums, pivot + 1, right);
5047
}
5148

52-
/* 快速排序类(中位基准数优化) */
53-
// 选取三个候选元素的中位数
49+
// 以下为中位数优化的快速排序
50+
51+
/* 选取三个候选元素的中位数 */
5452
int medianThree(int nums[], int left, int mid, int right) {
5553
int l = nums[left], m = nums[mid], r = nums[right];
5654
if ((l <= m && m <= r) || (r <= m && m <= l))
@@ -60,7 +58,7 @@ int medianThree(int nums[], int left, int mid, int right) {
6058
return right;
6159
}
6260

63-
/* 哨兵划分(三数取中值) */
61+
/* 哨兵划分(三数取中值) */
6462
int partitionMedian(int nums[], int left, int right) {
6563
// 选取三个候选元素的中位数
6664
int med = medianThree(nums, left, (left + right) / 2, right);
@@ -79,7 +77,7 @@ int partitionMedian(int nums[], int left, int right) {
7977
return i; // 返回基准数的索引
8078
}
8179

82-
// 中位基准数优化-快速排序
80+
/* 快速排序(三数取中值) */
8381
void quickSortMedian(int nums[], int left, int right) {
8482
// 子数组长度为 1 时终止递归
8583
if (left >= right)
@@ -91,20 +89,25 @@ void quickSortMedian(int nums[], int left, int right) {
9189
quickSortMedian(nums, pivot + 1, right);
9290
}
9391

94-
/* 快速排序类(尾递归优化) */
95-
// 快速排序(尾递归优化)
92+
// 以下为尾递归优化的快速排序
93+
94+
/* 快速排序(尾递归优化) */
9695
void quickSortTailCall(int nums[], int left, int right) {
9796
// 子数组长度为 1 时终止
9897
while (left < right) {
9998
// 哨兵划分操作
10099
int pivot = partition(nums, left, right);
101100
// 对两个子数组中较短的那个执行快速排序
102101
if (pivot - left < right - pivot) {
103-
quickSortTailCall(nums, left, pivot - 1); // 递归排序左子数组
104-
left = pivot + 1; // 剩余未排序区间为 [pivot + 1, right]
102+
// 递归排序左子数组
103+
quickSortTailCall(nums, left, pivot - 1);
104+
// 剩余未排序区间为 [pivot + 1, right]
105+
left = pivot + 1;
105106
} else {
106-
quickSortTailCall(nums, pivot + 1, right); // 递归排序右子数组
107-
right = pivot - 1; // 剩余未排序区间为 [left, pivot - 1]
107+
// 递归排序右子数组
108+
quickSortTailCall(nums, pivot + 1, right);
109+
// 剩余未排序区间为 [left, pivot - 1]
110+
right = pivot - 1;
108111
}
109112
}
110113
}

docs/chapter_preface/about_the_book.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@
3030

3131
## 致谢
3232

33-
本书在开源社区众多贡献者的共同努力下不断完善。感谢每一位投入时间与精力的撰稿人,他们是(按照 GitHub 自动生成的顺序):krahets、codingonion、nuomi1、Gonglja、Reanon、justin-tse、danielsss、hpstory、S-N-O-R-L-A-X、night-cruise、msk397、gvenusleo、RiverTwilight、gyt95、zhuoqinyue、Zuoxun、Xia-Sang、mingXta、FangYuan33、GN-Yu、IsChristina、xBLACKICEx、guowei-gong、Cathay-Chen、mgisr、JoseHung、qualifier1024、pengchzn、Guanngxu、longsizhuo、L-Super、what-is-me、yuan0221、lhxsm、Slone123c、WSL0809、longranger2、theNefelibatas、xiongsp、JeffersonHuang、hongyun-robot、K3v123、yuelinxin、a16su、gaofer、malone6、Wonderdch、xjr7670、DullSword、Horbin-Magician、NI-SW、reeswell、XC-Zero、XiaChuerwu、yd-j、iron-irax、huawuque404、MolDuM、Nigh、KorsChen、foursevenlove、52coder、bubble9um、youshaoXG、curly210102、gltianwen、fanchenggang、Transmigration-zhou、FloranceYeh、FreddieLi、ShiMaRing、lipusheng、Javesun99、JackYang-hellobobo、shanghai-Jerry、0130w、Keynman、psychelzh、logan-qiu、ZnYang2018、MwumLi、1ch0、Phoenix0415、qingpeng9802、Richard-Zhang1019、QiLOL、Suremotoo、Turing-1024-Lee、Evilrabbit520、GaochaoZhu、ZJKung、linzeyan、hezhizhen、ZongYangL、beintentional、czruby、coderlef、dshlstarr、szu17dmy、fbigm、gledfish、hts0000、boloboloda、iStig、jiaxianhua、wenjianmin、keshida、kilikilikid、lclc6、lwbaptx、liuxjerry、lucaswangdev、lyl625760、chadyi、noobcodemaker、selear、siqyka、syd168、4yDX3906、tao363、wangwang105、weibk、yabo083、yi427、yishangzhang、zhouLion、baagod、ElaBosak233、xb534、luluxia、yanedie、thomasq0、YangXuanyi 和 th1nk3r-ing 。
33+
本书在开源社区众多贡献者的共同努力下不断完善。感谢每一位投入时间与精力的撰稿人,他们是(按照 GitHub 自动生成的顺序):krahets、Gonglja、nuomi1、codingonion、Reanon、justin-tse、hpstory、danielsss、curtishd、night-cruise、S-N-O-R-L-A-X、msk397、gvenusleo、RiverTwilight、gyt95、zhuoqinyue、Zuoxun、mingXta、hello-ikun、khoaxuantu、FangYuan33、GN-Yu、longsizhuo、mgisr、Cathay-Chen、guowei-gong、xBLACKICEx、K3v123、IsChristina、JoseHung、qualifier1024、pengchzn、Guanngxu、QiLOL、L-Super、WSL0809、Slone123c、lhxsm、yuan0221、what-is-me、rongyi、JeffersonHuang、longranger2、theNefelibatas、yuelinxin、xiongsp、nanlei、a16su、cy-by-side、gaofer、malone6、Wonderdch、hongyun-robot、XiaChuerwu、yd-j、bluebean-cloud、iron-irax、he-weilai、Nigh、MolDuM、Phoenix0415、XC-Zero、SamJin98、reeswell、NI-SW、Horbin-Magician、xjr7670、YangXuanyi、DullSword、iStig、qq909244296、jiaxianhua、wenjianmin、keshida、kilikilikid、lclc6、lwbaptx、luluxia、boloboloda、hts0000、gledfish、fbigm、echo1937、szu17dmy、dshlstarr、coderlef、czruby、beintentional、KeiichiKasai、xb534、ElaBosak233、baagod、zhouLion、yishangzhang、yi427、yabo083、weibk、wangwang105、th1nk3r-ing、tao363、4yDX3906、syd168、siqyka、selear、sdshaoda、noobcodemaker、chadyi、lyl625760、lucaswangdev、liuxjerry、0130w、shanghai-Jerry、JackYang-hellobobo、Javesun99、lipusheng、ShiMaRing、FreddieLi、FloranceYeh、Transmigration-zhou、fanchenggang、gltianwen、Dr-XYZ、curly210102、CuB3y0nd、youshaoXG、bubble9um、fanenr、52coder、foursevenlove、KorsChen、ZongYangL、hezhizhen、linzeyan、ZJKung、GaochaoZhu、yang-le、Evilrabbit520、Turing-1024-Lee、Suremotoo、Allen-Scai、Richard-Zhang1019、qingpeng9802、primexiao、nidhoggfgg、1ch0、MwumLi、ZnYang2018、hugtyftg、logan-qiu、psychelzh 和 Keynman 。
3434

35-
本书的代码审阅工作由 codingonion、Gonglja、gvenusleo、hpstory、justin-tse、krahets、night-cruise、nuomi1 和 Reanon 完成(按照首字母顺序排列)。感谢他们付出的时间与精力,正是他们确保了各语言代码的规范与统一。
35+
本书的代码审阅工作由 codingonion、curtishd、Gonglja、gvenusleo、hpstory、justin-tse、krahets、night-cruise、nuomi1 和 Reanon 完成(按照首字母顺序排列)。感谢他们付出的时间与精力,正是他们确保了各语言代码的规范与统一。
3636

3737
在本书的创作过程中,我得到了许多人的帮助。
3838

mkdocs.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ site_dir: site
99
repo_name: krahets/hello-algo
1010
repo_url: https://github.com/krahets/hello-algo
1111
edit_uri: tree/main/docs
12-
version: 1.0.0
12+
version: 1.1.0
1313

1414
# Copyright
1515
copyright: Copyright &copy; 2022-2024 krahets<br>The website content is licensed under <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/">CC BY-NC-SA 4.0</a>

overrides/main.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
{% elif config.theme.language == 'zh-Hant' %}
77
{% set announcements = '紙質書(簡體中文版)已發行,詳情請見<a href="/chapter_paperbook/">這裡</a>' %}
88
{% elif config.theme.language == 'en' %}
9-
{% set announcements = 'Feel free to engage in Chinese-to-English translation and pull request review! Please visit <a href="https://github.com/krahets/hello-algo/issues/914">#914</a> for details.' %}
9+
{% set announcements = 'Welcome to contribute to Chinese-to-English translation! Please visit <a href="https://github.com/krahets/hello-algo/issues/914">#914</a> for more details.' %}
1010
{% endif %}
1111
<div class="banner-svg">
1212
<svg xmlns="http://www.w3.org/2000/svg"

zh-hant/codes/c/chapter_dynamic_programming/coin_change.c

+5-1
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,12 @@ int coinChangeDPComp(int coins[], int amt, int coinsSize) {
5050
int n = coinsSize;
5151
int MAX = amt + 1;
5252
// 初始化 dp 表
53-
int *dp = calloc(amt + 1, sizeof(int));
53+
int *dp = malloc((amt + 1) * sizeof(int));
54+
for (int j = 1; j <= amt; j++) {
55+
dp[j] = MAX;
56+
}
5457
dp[0] = 0;
58+
5559
// 狀態轉移
5660
for (int i = 1; i <= n; i++) {
5761
for (int a = 1; a <= amt; a++) {

zh-hant/codes/c/chapter_hashing/array_hash_map.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
#include "../utils/common.h"
88

99
/* 雜湊表預設大小 */
10-
#define 100
10+
#define MAX_SIZE 100
1111

1212
/* 鍵值對 int->string */
1313
typedef struct {
@@ -29,7 +29,7 @@ typedef struct {
2929
/* 建構子 */
3030
ArrayHashMap *newArrayHashMap() {
3131
ArrayHashMap *hmap = malloc(sizeof(ArrayHashMap));
32-
for (int i = 0; i < MAX_SIZE; i++) {
32+
for (int i=0; i < MAX_SIZE; i++) {
3333
hmap->buckets[i] = NULL;
3434
}
3535
return hmap;

zh-hant/codes/c/chapter_heap/my_heap.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ int right(MaxHeap *maxHeap, int i) {
5252

5353
/* 獲取父節點的索引 */
5454
int parent(MaxHeap *maxHeap, int i) {
55-
return (i - 1) / 2;
55+
return (i - 1) / 2; // 向下取整
5656
}
5757

5858
/* 交換元素 */

zh-hant/codes/c/chapter_sorting/bucket_sort.c

+1-5
Original file line numberDiff line numberDiff line change
@@ -20,24 +20,20 @@ void bucketSort(float nums[], int n) {
2020
int k = n / 2; // 初始化 k = n/2 個桶
2121
int *sizes = malloc(k * sizeof(int)); // 記錄每個桶的大小
2222
float **buckets = malloc(k * sizeof(float *)); // 動態陣列的陣列(桶)
23-
23+
// 為每個桶預分配足夠的空間
2424
for (int i = 0; i < k; ++i) {
25-
// 為每個桶預分配足夠的空間
2625
buckets[i] = (float *)malloc(n * sizeof(float));
2726
sizes[i] = 0;
2827
}
29-
3028
// 1. 將陣列元素分配到各個桶中
3129
for (int i = 0; i < n; ++i) {
3230
int idx = (int)(nums[i] * k);
3331
buckets[idx][sizes[idx]++] = nums[i];
3432
}
35-
3633
// 2. 對各個桶執行排序
3734
for (int i = 0; i < k; ++i) {
3835
qsort(buckets[i], sizes[i], sizeof(float), compare);
3936
}
40-
4137
// 3. 合併排序後的桶
4238
int idx = 0;
4339
for (int i = 0; i < k; ++i) {

zh-hant/codes/c/chapter_sorting/quick_sort.c

+20-17
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,16 @@ void swap(int nums[], int i, int j) {
1313
nums[j] = tmp;
1414
}
1515

16-
/* 快速排序類別 */
17-
// 快速排序類別-哨兵劃分
16+
/* 哨兵劃分 */
1817
int partition(int nums[], int left, int right) {
1918
// 以 nums[left] 為基準數
2019
int i = left, j = right;
2120
while (i < j) {
2221
while (i < j && nums[j] >= nums[left]) {
23-
// 從右向左找首個小於基準數的元素
24-
j--;
22+
j--; // 從右向左找首個小於基準數的元素
2523
}
2624
while (i < j && nums[i] <= nums[left]) {
27-
// 從左向右找首個大於基準數的元素
28-
i++;
25+
i++; // 從左向右找首個大於基準數的元素
2926
}
3027
// 交換這兩個元素
3128
swap(nums, i, j);
@@ -36,7 +33,7 @@ int partition(int nums[], int left, int right) {
3633
return i;
3734
}
3835

39-
// 快速排序類別-快速排序
36+
/* 快速排序 */
4037
void quickSort(int nums[], int left, int right) {
4138
// 子陣列長度為 1 時終止遞迴
4239
if (left >= right) {
@@ -49,8 +46,9 @@ void quickSort(int nums[], int left, int right) {
4946
quickSort(nums, pivot + 1, right);
5047
}
5148

52-
/* 快速排序類別(中位基準數最佳化) */
53-
// 選取三個候選元素的中位數
49+
// 以下為中位數最佳化的快速排序
50+
51+
/* 選取三個候選元素的中位數 */
5452
int medianThree(int nums[], int left, int mid, int right) {
5553
int l = nums[left], m = nums[mid], r = nums[right];
5654
if ((l <= m && m <= r) || (r <= m && m <= l))
@@ -60,7 +58,7 @@ int medianThree(int nums[], int left, int mid, int right) {
6058
return right;
6159
}
6260

63-
/* 哨兵劃分(三數取中值) */
61+
/* 哨兵劃分(三數取中值) */
6462
int partitionMedian(int nums[], int left, int right) {
6563
// 選取三個候選元素的中位數
6664
int med = medianThree(nums, left, (left + right) / 2, right);
@@ -79,7 +77,7 @@ int partitionMedian(int nums[], int left, int right) {
7977
return i; // 返回基準數的索引
8078
}
8179

82-
// 中位基準數最佳化-快速排序
80+
/* 快速排序(三數取中值) */
8381
void quickSortMedian(int nums[], int left, int right) {
8482
// 子陣列長度為 1 時終止遞迴
8583
if (left >= right)
@@ -91,20 +89,25 @@ void quickSortMedian(int nums[], int left, int right) {
9189
quickSortMedian(nums, pivot + 1, right);
9290
}
9391

94-
/* 快速排序類別(尾遞迴最佳化) */
95-
// 快速排序(尾遞迴最佳化)
92+
// 以下為尾遞迴最佳化的快速排序
93+
94+
/* 快速排序(尾遞迴最佳化) */
9695
void quickSortTailCall(int nums[], int left, int right) {
9796
// 子陣列長度為 1 時終止
9897
while (left < right) {
9998
// 哨兵劃分操作
10099
int pivot = partition(nums, left, right);
101100
// 對兩個子陣列中較短的那個執行快速排序
102101
if (pivot - left < right - pivot) {
103-
quickSortTailCall(nums, left, pivot - 1); // 遞迴排序左子陣列
104-
left = pivot + 1; // 剩餘未排序區間為 [pivot + 1, right]
102+
// 遞迴排序左子陣列
103+
quickSortTailCall(nums, left, pivot - 1);
104+
// 剩餘未排序區間為 [pivot + 1, right]
105+
left = pivot + 1;
105106
} else {
106-
quickSortTailCall(nums, pivot + 1, right); // 遞迴排序右子陣列
107-
right = pivot - 1; // 剩餘未排序區間為 [left, pivot - 1]
107+
// 遞迴排序右子陣列
108+
quickSortTailCall(nums, pivot + 1, right);
109+
// 剩餘未排序區間為 [left, pivot - 1]
110+
right = pivot - 1;
108111
}
109112
}
110113
}

zh-hant/codes/kotlin/chapter_array_and_linkedlist/linked_list.kt

+3-2
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ fun insert(n0: ListNode?, p: ListNode?) {
2020
fun remove(n0: ListNode?) {
2121
if (n0?.next == null)
2222
return
23+
// n0 -> P -> n1
2324
val p = n0.next
2425
val n1 = p?.next
2526
n0.next = n1
@@ -78,10 +79,10 @@ fun main() {
7879
printLinkedList(n0)
7980

8081
/* 訪問節點 */
81-
val node: ListNode = access(n0, 3)!!
82+
val node = access(n0, 3)!!
8283
println("鏈結串列中索引 3 處的節點的值 = ${node._val}")
8384

8485
/* 查詢節點 */
85-
val index: Int = find(n0, 2)
86+
val index = find(n0, 2)
8687
println("鏈結串列中值為 2 的節點的索引 = $index")
8788
}

zh-hant/codes/kotlin/chapter_computational_complexity/recursion.kt

+1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ fun forLoopRecur(n: Int): Int {
2626
var res = 0
2727
// 遞: 遞迴呼叫
2828
for (i in n downTo 0) {
29+
// 透過“入堆疊操作”模擬“遞”
2930
stack.push(i)
3031
}
3132
// 迴: 返回結果

zh-hant/codes/kotlin/chapter_computational_complexity/time_complexity.kt

+4-3
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ fun constant(n: Int): Int {
1818
/* 線性階 */
1919
fun linear(n: Int): Int {
2020
var count = 0
21-
// 迴圈次數與陣列長度成正比
2221
for (i in 0..<n)
2322
count++
2423
return count
@@ -55,7 +54,9 @@ fun bubbleSort(nums: IntArray): Int {
5554
for (j in 0..<i) {
5655
if (nums[j] > nums[j + 1]) {
5756
// 交換 nums[j] 與 nums[j + 1]
58-
nums[j] = nums[j + 1].also { nums[j + 1] = nums[j] }
57+
val temp = nums[j]
58+
nums[j] = nums[j + 1]
59+
nums[j + 1] = temp
5960
count += 3 // 元素交換包含 3 個單元操作
6061
}
6162
}
@@ -66,8 +67,8 @@ fun bubbleSort(nums: IntArray): Int {
6667
/* 指數階(迴圈實現) */
6768
fun exponential(n: Int): Int {
6869
var count = 0
69-
// 細胞每輪一分為二,形成數列 1, 2, 4, 8, ..., 2^(n-1)
7070
var base = 1
71+
// 細胞每輪一分為二,形成數列 1, 2, 4, 8, ..., 2^(n-1)
7172
for (i in 0..<n) {
7273
for (j in 0..<base) {
7374
count++

zh-hant/codes/kotlin/chapter_computational_complexity/worst_best_time_complexity.kt

+2-3
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,11 @@ fun randomNumbers(n: Int): Array<Int?> {
1313
for (i in 0..<n) {
1414
nums[i] = i + 1
1515
}
16-
val mutableList = nums.toMutableList()
1716
// 隨機打亂陣列元素
18-
mutableList.shuffle()
17+
nums.shuffle()
1918
val res = arrayOfNulls<Int>(n)
2019
for (i in 0..<n) {
21-
res[i] = mutableList[i]
20+
res[i] = nums[i]
2221
}
2322
return res
2423
}

zh-hant/codes/kotlin/chapter_dynamic_programming/climbing_stairs_dp.kt

+3-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@ fun climbingStairsDPComp(n: Int): Int {
2727
var a = 1
2828
var b = 2
2929
for (i in 3..n) {
30-
b += a.also { a = b }
30+
val temp = b
31+
b += a
32+
a = temp
3133
}
3234
return b
3335
}

0 commit comments

Comments
 (0)