Skip to content

Commit 21be3fd

Browse files
rongyikrahets
andauthored
[Rust] Normalize mid calculation in case overflow (#1363)
* Normalize mid calculate in case overflow * Change ALL language * Update merge_sort.py * Update merge_sort.zig * Update binary_search_tree.zig * Update binary_search_recur.py --------- Co-authored-by: Yudong Jin <[email protected]>
1 parent 0e22154 commit 21be3fd

File tree

41 files changed

+57
-59
lines changed

Some content is hidden

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

41 files changed

+57
-59
lines changed

codes/c/chapter_sorting/merge_sort.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ void mergeSort(int *nums, int left, int right) {
4343
if (left >= right)
4444
return; // 当子数组长度为 1 时终止递归
4545
// 划分阶段
46-
int mid = (left + right) / 2; // 计算中点
46+
int mid = left + (right - left) / 2; // 计算中点
4747
mergeSort(nums, left, mid); // 递归左子数组
4848
mergeSort(nums, mid + 1, right); // 递归右子数组
4949
// 合并阶段

codes/cpp/chapter_sorting/merge_sort.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ void mergeSort(vector<int> &nums, int left, int right) {
3939
if (left >= right)
4040
return; // 当子数组长度为 1 时终止递归
4141
// 划分阶段
42-
int mid = (left + right) / 2; // 计算中点
42+
int mid = left + (right - left) / 2; // 计算中点
4343
mergeSort(nums, left, mid); // 递归左子数组
4444
mergeSort(nums, mid + 1, right); // 递归右子数组
4545
// 合并阶段

codes/csharp/chapter_sorting/merge_sort.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ void MergeSort(int[] nums, int left, int right) {
3939
// 终止条件
4040
if (left >= right) return; // 当子数组长度为 1 时终止递归
4141
// 划分阶段
42-
int mid = (left + right) / 2; // 计算中点
42+
int mid = left + (right - left) / 2; // 计算中点
4343
MergeSort(nums, left, mid); // 递归左子数组
4444
MergeSort(nums, mid + 1, right); // 递归右子数组
4545
// 合并阶段

codes/dart/chapter_sorting/merge_sort.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ void mergeSort(List<int> nums, int left, int right) {
3636
// 终止条件
3737
if (left >= right) return; // 当子数组长度为 1 时终止递归
3838
// 划分阶段
39-
int mid = (left + right) ~/ 2; // 计算中点
39+
int mid = left + (right - left) ~/ 2; // 计算中点
4040
mergeSort(nums, left, mid); // 递归左子数组
4141
mergeSort(nums, mid + 1, right); // 递归右子数组
4242
// 合并阶段

codes/go/chapter_sorting/merge_sort.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ func mergeSort(nums []int, left, right int) {
4646
return
4747
}
4848
// 划分阶段
49-
mid := (left + right) / 2
49+
mid := left + (right - left) / 2
5050
mergeSort(nums, left, mid)
5151
mergeSort(nums, mid+1, right)
5252
// 合并阶段

codes/java/chapter_sorting/merge_sort.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ static void mergeSort(int[] nums, int left, int right) {
4242
if (left >= right)
4343
return; // 当子数组长度为 1 时终止递归
4444
// 划分阶段
45-
int mid = (left + right) / 2; // 计算中点
45+
int mid = left + (right - left) / 2; // 计算中点
4646
mergeSort(nums, left, mid); // 递归左子数组
4747
mergeSort(nums, mid + 1, right); // 递归右子数组
4848
// 合并阶段

codes/javascript/chapter_sorting/merge_sort.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ function mergeSort(nums, left, right) {
3939
// 终止条件
4040
if (left >= right) return; // 当子数组长度为 1 时终止递归
4141
// 划分阶段
42-
let mid = Math.floor((left + right) / 2); // 计算中点
42+
let mid = Math.floor(left + (right - left) / 2); // 计算中点
4343
mergeSort(nums, left, mid); // 递归左子数组
4444
mergeSort(nums, mid + 1, right); // 递归右子数组
4545
// 合并阶段

codes/kotlin/chapter_sorting/merge_sort.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ fun mergeSort(nums: IntArray, left: Int, right: Int) {
4040
// 终止条件
4141
if (left >= right) return // 当子数组长度为 1 时终止递归
4242
// 划分阶段
43-
val mid = (left + right) / 2 // 计算中点
43+
val mid = left + (right - left) / 2 // 计算中点
4444
mergeSort(nums, left, mid) // 递归左子数组
4545
mergeSort(nums, mid + 1, right) // 递归右子数组
4646
// 合并阶段
@@ -53,4 +53,4 @@ fun main() {
5353
val nums = intArrayOf(7, 3, 2, 6, 0, 1, 5, 4)
5454
mergeSort(nums, 0, nums.size - 1)
5555
println("归并排序完成后 nums = ${nums.contentToString()}")
56-
}
56+
}

codes/python/chapter_sorting/merge_sort.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ def merge_sort(nums: list[int], left: int, right: int):
4141
if left >= right:
4242
return # 当子数组长度为 1 时终止递归
4343
# 划分阶段
44-
mid = (left + right) // 2 # 计算中点
44+
mid = (left + right) // 2 # 计算中点
4545
merge_sort(nums, left, mid) # 递归左子数组
4646
merge_sort(nums, mid + 1, right) # 递归右子数组
4747
# 合并阶段

codes/ruby/chapter_sorting/merge_sort.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ def merge_sort(nums, left, right)
4545
# 当子数组长度为 1 时终止递归
4646
return if left >= right
4747
# 划分阶段
48-
mid = (left + right) / 2 # 计算中点
48+
mid = left + (right - left) / 2 # 计算中点
4949
merge_sort(nums, left, mid) # 递归左子数组
5050
merge_sort(nums, mid + 1, right) # 递归右子数组
5151
# 合并阶段

codes/rust/chapter_divide_and_conquer/binary_search_recur.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ fn dfs(nums: &[i32], target: i32, i: i32, j: i32) -> i32 {
1010
if i > j {
1111
return -1;
1212
}
13-
let m: i32 = (i + j) / 2;
13+
let m: i32 = i + (j - i) / 2;
1414
if nums[m as usize] < target {
1515
// 递归子问题 f(m+1, j)
1616
return dfs(nums, target, m + 1, j);

codes/rust/chapter_sorting/merge_sort.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ fn merge_sort(nums: &mut [i32], left: usize, right: usize) {
4848
}
4949

5050
// 划分阶段
51-
let mid = (left + right) / 2; // 计算中点
51+
let mid = left + (right - left) / 2; // 计算中点
5252
merge_sort(nums, left, mid); // 递归左子数组
5353
merge_sort(nums, mid + 1, right); // 递归右子数组
5454

codes/rust/chapter_sorting/radix_sort.rs

+1-3
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,7 @@ fn counting_sort_digit(nums: &mut [i32], exp: i32) {
3535
counter[d] -= 1; // 将 d 的数量减 1
3636
}
3737
// 使用结果覆盖原数组 nums
38-
for i in 0..n {
39-
nums[i] = res[i];
40-
}
38+
nums.copy_from_slice(&res);
4139
}
4240

4341
/* 基数排序 */

codes/swift/chapter_sorting/merge_sort.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ func mergeSort(nums: inout [Int], left: Int, right: Int) {
4646
return
4747
}
4848
// 划分阶段
49-
let mid = (left + right) / 2 // 计算中点
49+
let mid = left + (right - left) / 2 // 计算中点
5050
mergeSort(nums: &nums, left: left, right: mid) // 递归左子数组
5151
mergeSort(nums: &nums, left: mid + 1, right: right) // 递归右子数组
5252
// 合并阶段

codes/swift/chapter_sorting/quick_sort.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ func medianThree(nums: [Int], left: Int, mid: Int, right: Int) -> Int {
5454
/* 哨兵划分(三数取中值) */
5555
func partitionMedian(nums: inout [Int], left: Int, right: Int) -> Int {
5656
// 选取三个候选元素的中位数
57-
let med = medianThree(nums: nums, left: left, mid: (left + right) / 2, right: right)
57+
let med = medianThree(nums: nums, left: left, mid: left + (right - left) / 2, right: right)
5858
// 将中位数交换至数组最左端
5959
nums.swapAt(left, med)
6060
return partition(nums: &nums, left: left, right: right)

codes/typescript/chapter_sorting/merge_sort.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ function mergeSort(nums: number[], left: number, right: number): void {
3939
// 终止条件
4040
if (left >= right) return; // 当子数组长度为 1 时终止递归
4141
// 划分阶段
42-
let mid = Math.floor((left + right) / 2); // 计算中点
42+
let mid = Math.floor(left + (right - left) / 2); // 计算中点
4343
mergeSort(nums, left, mid); // 递归左子数组
4444
mergeSort(nums, mid + 1, right); // 递归右子数组
4545
// 合并阶段

codes/zig/chapter_sorting/merge_sort.zig

+4-4
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@ fn merge(nums: []i32, left: usize, mid: usize, right: usize) !void {
1515
const mem_allocator = mem_arena.allocator();
1616
var tmp = try mem_allocator.alloc(i32, right + 1 - left);
1717
std.mem.copy(i32, tmp, nums[left..right+1]);
18-
// 左子数组的起始索引和结束索引
18+
// 左子数组的起始索引和结束索引
1919
var leftStart = left - left;
2020
var leftEnd = mid - left;
21-
// 右子数组的起始索引和结束索引
21+
// 右子数组的起始索引和结束索引
2222
var rightStart = mid + 1 - left;
2323
var rightEnd = right - left;
2424
// i, j 分别指向左子数组、右子数组的首元素
@@ -48,7 +48,7 @@ fn mergeSort(nums: []i32, left: usize, right: usize) !void {
4848
// 终止条件
4949
if (left >= right) return; // 当子数组长度为 1 时终止递归
5050
// 划分阶段
51-
var mid = (left + right) / 2; // 计算中点
51+
var mid = left + (right - left) / 2; // 计算中点
5252
try mergeSort(nums, left, mid); // 递归左子数组
5353
try mergeSort(nums, mid + 1, right); // 递归右子数组
5454
// 合并阶段
@@ -64,4 +64,4 @@ pub fn main() !void {
6464
inc.PrintUtil.printArray(i32, &nums);
6565

6666
_ = try std.io.getStdIn().reader().readByte();
67-
}
67+
}

codes/zig/chapter_tree/binary_search_tree.zig

+3-3
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ pub fn BinarySearchTree(comptime T: type) type {
3434
fn buildTree(self: *Self, nums: []T, i: usize, j: usize) !?*inc.TreeNode(T) {
3535
if (i > j) return null;
3636
// 将数组中间节点作为根节点
37-
var mid = (i + j) / 2;
37+
var mid = i + (j - i) / 2;
3838
var node = try self.mem_allocator.create(inc.TreeNode(T));
3939
node.init(nums[mid]);
4040
// 递归建立左子树和右子树
@@ -145,7 +145,7 @@ pub fn BinarySearchTree(comptime T: type) type {
145145
cur.?.val = tmp_val;
146146
}
147147
}
148-
};
148+
};
149149
}
150150

151151
// Driver Code
@@ -179,4 +179,4 @@ pub fn main() !void {
179179
try inc.PrintUtil.printTree(bst.getRoot(), null, false);
180180

181181
_ = try std.io.getStdIn().reader().readByte();
182-
}
182+
}

en/codes/cpp/chapter_divide_and_conquer/binary_search_recur.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ int dfs(vector<int> &nums, int target, int i, int j) {
1313
return -1;
1414
}
1515
// Calculate midpoint index m
16-
int m = (i + j) / 2;
16+
int m = i + (j - i) / 2;
1717
if (nums[m] < target) {
1818
// Recursive subproblem f(m+1, j)
1919
return dfs(nums, target, m + 1, j);
@@ -43,4 +43,4 @@ int main() {
4343
cout << "Index of target element 6 =" << index << endl;
4444

4545
return 0;
46-
}
46+
}

en/codes/cpp/chapter_sorting/merge_sort.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ void mergeSort(vector<int> &nums, int left, int right) {
3939
if (left >= right)
4040
return; // Terminate recursion when subarray length is 1
4141
// Partition stage
42-
int mid = (left + right) / 2; // Calculate midpoint
42+
int mid = left + (right - left) / 2; // Calculate midpoint
4343
mergeSort(nums, left, mid); // Recursively process the left subarray
4444
mergeSort(nums, mid + 1, right); // Recursively process the right subarray
4545
// Merge stage

en/codes/java/chapter_divide_and_conquer/binary_search_recur.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ static int dfs(int[] nums, int target, int i, int j) {
1414
return -1;
1515
}
1616
// Calculate midpoint index m
17-
int m = (i + j) / 2;
17+
int m = i + (j - i) / 2;
1818
if (nums[m] < target) {
1919
// Recursive subproblem f(m+1, j)
2020
return dfs(nums, target, m + 1, j);

en/codes/java/chapter_sorting/merge_sort.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ static void mergeSort(int[] nums, int left, int right) {
4242
if (left >= right)
4343
return; // Terminate recursion when subarray length is 1
4444
// Partition stage
45-
int mid = (left + right) / 2; // Calculate midpoint
45+
int mid = left + (right - left) / 2; // Calculate midpoint
4646
mergeSort(nums, left, mid); // Recursively process the left subarray
4747
mergeSort(nums, mid + 1, right); // Recursively process the right subarray
4848
// Merge stage

en/codes/python/chapter_searching/binary_search.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ def binary_search(nums: list[int], target: int) -> int:
1212
# Loop until the search interval is empty (when i > j, it is empty)
1313
while i <= j:
1414
# Theoretically, Python's numbers can be infinitely large (depending on memory size), so there is no need to consider large number overflow
15-
m = (i + j) // 2 # Calculate midpoint index m
15+
m = i + (j - i) // 2 # Calculate midpoint index m
1616
if nums[m] < target:
1717
i = m + 1 # This situation indicates that target is in the interval [m+1, j]
1818
elif nums[m] > target:
@@ -28,7 +28,7 @@ def binary_search_lcro(nums: list[int], target: int) -> int:
2828
i, j = 0, len(nums)
2929
# Loop until the search interval is empty (when i = j, it is empty)
3030
while i < j:
31-
m = (i + j) // 2 # Calculate midpoint index m
31+
m = i + (j - i) // 2 # Calculate midpoint index m
3232
if nums[m] < target:
3333
i = m + 1 # This situation indicates that target is in the interval [m+1, j)
3434
elif nums[m] > target:

en/codes/python/chapter_searching/binary_search_insertion.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ def binary_search_insertion_simple(nums: list[int], target: int) -> int:
99
"""Binary search for insertion point (no duplicate elements)"""
1010
i, j = 0, len(nums) - 1 # Initialize double closed interval [0, n-1]
1111
while i <= j:
12-
m = (i + j) // 2 # Calculate midpoint index m
12+
m = i + (j - i) // 2 # Calculate midpoint index m
1313
if nums[m] < target:
1414
i = m + 1 # Target is in interval [m+1, j]
1515
elif nums[m] > target:
@@ -24,7 +24,7 @@ def binary_search_insertion(nums: list[int], target: int) -> int:
2424
"""Binary search for insertion point (with duplicate elements)"""
2525
i, j = 0, len(nums) - 1 # Initialize double closed interval [0, n-1]
2626
while i <= j:
27-
m = (i + j) // 2 # Calculate midpoint index m
27+
m = i + (j - i) // 2 # Calculate midpoint index m
2828
if nums[m] < target:
2929
i = m + 1 # Target is in interval [m+1, j]
3030
elif nums[m] > target:

en/codes/python/chapter_sorting/merge_sort.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ def merge_sort(nums: list[int], left: int, right: int):
4141
if left >= right:
4242
return # Terminate recursion when subarray length is 1
4343
# Partition stage
44-
mid = (left + right) // 2 # Calculate midpoint
44+
mid = left + (right - left) // 2 # Calculate midpoint
4545
merge_sort(nums, left, mid) # Recursively process the left subarray
4646
merge_sort(nums, mid + 1, right) # Recursively process the right subarray
4747
# Merge stage

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ void mergeSort(int *nums, int left, int right) {
4343
if (left >= right)
4444
return; // 當子陣列長度為 1 時終止遞迴
4545
// 劃分階段
46-
int mid = (left + right) / 2; // 計算中點
46+
int mid = left + (right - left) / 2; // 計算中點
4747
mergeSort(nums, left, mid); // 遞迴左子陣列
4848
mergeSort(nums, mid + 1, right); // 遞迴右子陣列
4949
// 合併階段

zh-hant/codes/cpp/chapter_sorting/merge_sort.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ void mergeSort(vector<int> &nums, int left, int right) {
3939
if (left >= right)
4040
return; // 當子陣列長度為 1 時終止遞迴
4141
// 劃分階段
42-
int mid = (left + right) / 2; // 計算中點
42+
int mid = left + (right - left) / 2; // 計算中點
4343
mergeSort(nums, left, mid); // 遞迴左子陣列
4444
mergeSort(nums, mid + 1, right); // 遞迴右子陣列
4545
// 合併階段

zh-hant/codes/csharp/chapter_sorting/merge_sort.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ void MergeSort(int[] nums, int left, int right) {
3939
// 終止條件
4040
if (left >= right) return; // 當子陣列長度為 1 時終止遞迴
4141
// 劃分階段
42-
int mid = (left + right) / 2; // 計算中點
42+
int mid = left + (right - left) / 2; // 計算中點
4343
MergeSort(nums, left, mid); // 遞迴左子陣列
4444
MergeSort(nums, mid + 1, right); // 遞迴右子陣列
4545
// 合併階段

zh-hant/codes/dart/chapter_sorting/merge_sort.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ void mergeSort(List<int> nums, int left, int right) {
3636
// 終止條件
3737
if (left >= right) return; // 當子陣列長度為 1 時終止遞迴
3838
// 劃分階段
39-
int mid = (left + right) ~/ 2; // 計算中點
39+
int mid = left + (right - left) ~/ 2; // 計算中點
4040
mergeSort(nums, left, mid); // 遞迴左子陣列
4141
mergeSort(nums, mid + 1, right); // 遞迴右子陣列
4242
// 合併階段

zh-hant/codes/go/chapter_sorting/merge_sort.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ func mergeSort(nums []int, left, right int) {
4646
return
4747
}
4848
// 劃分階段
49-
mid := (left + right) / 2
49+
mid := left + (right - left) / 2
5050
mergeSort(nums, left, mid)
5151
mergeSort(nums, mid+1, right)
5252
// 合併階段

zh-hant/codes/java/chapter_sorting/merge_sort.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ static void mergeSort(int[] nums, int left, int right) {
4242
if (left >= right)
4343
return; // 當子陣列長度為 1 時終止遞迴
4444
// 劃分階段
45-
int mid = (left + right) / 2; // 計算中點
45+
int mid = left + (right - left) / 2; // 計算中點
4646
mergeSort(nums, left, mid); // 遞迴左子陣列
4747
mergeSort(nums, mid + 1, right); // 遞迴右子陣列
4848
// 合併階段

zh-hant/codes/javascript/chapter_sorting/merge_sort.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ function mergeSort(nums, left, right) {
3939
// 終止條件
4040
if (left >= right) return; // 當子陣列長度為 1 時終止遞迴
4141
// 劃分階段
42-
let mid = Math.floor((left + right) / 2); // 計算中點
42+
let mid = Math.floor(left + (right - left) / 2); // 計算中點
4343
mergeSort(nums, left, mid); // 遞迴左子陣列
4444
mergeSort(nums, mid + 1, right); // 遞迴右子陣列
4545
// 合併階段

zh-hant/codes/kotlin/chapter_sorting/merge_sort.kt

+3-3
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ fun merge(nums: IntArray, left: Int, mid: Int, right: Int) {
1919
while (i <= mid && j <= right) {
2020
if (nums[i] <= nums[j])
2121
tmp[k++] = nums[i++]
22-
else
22+
else
2323
tmp[k++] = nums[j++]
2424
}
2525
// 將左子陣列和右子陣列的剩餘元素複製到臨時陣列中
@@ -40,7 +40,7 @@ fun mergeSort(nums: IntArray, left: Int, right: Int) {
4040
// 終止條件
4141
if (left >= right) return // 當子陣列長度為 1 時終止遞迴
4242
// 劃分階段
43-
val mid = (left + right) / 2 // 計算中點
43+
val mid = left + (right - left) / 2 // 計算中點
4444
mergeSort(nums, left, mid) // 遞迴左子陣列
4545
mergeSort(nums, mid + 1, right) // 遞迴右子陣列
4646
// 合併階段
@@ -53,4 +53,4 @@ fun main() {
5353
val nums = intArrayOf(7, 3, 2, 6, 0, 1, 5, 4)
5454
mergeSort(nums, 0, nums.size - 1)
5555
println("合併排序完成後 nums = ${nums.contentToString()}")
56-
}
56+
}

zh-hant/codes/python/chapter_sorting/merge_sort.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ def merge_sort(nums: list[int], left: int, right: int):
4141
if left >= right:
4242
return # 當子陣列長度為 1 時終止遞迴
4343
# 劃分階段
44-
mid = (left + right) // 2 # 計算中點
44+
mid = left + (right - left) // 2 # 計算中點
4545
merge_sort(nums, left, mid) # 遞迴左子陣列
4646
merge_sort(nums, mid + 1, right) # 遞迴右子陣列
4747
# 合併階段

0 commit comments

Comments
 (0)