Skip to content

Commit 1cb7b39

Browse files
committed
Selection comments updated.
1 parent cf0e978 commit 1cb7b39

File tree

2 files changed

+58
-7
lines changed
  • 03-Sorting-Advance
    • Course Code (C++)/Optional-05-Selection
    • Course Code (Java)/Optional-05-Selection/src/bobo/algo

2 files changed

+58
-7
lines changed

03-Sorting-Advance/Course Code (C++)/Optional-05-Selection/main.cpp

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,15 @@ int __selection( T arr[], int l, int r, int k ){
3838
return arr[p];
3939
else if( k < p ) // 如果 k < p, 只需要在arr[l...p-1]中找第k小元素即可
4040
return __selection( arr, l, p-1, k);
41-
else // 如果 k > p, 则需要在arr[p+1...r]中找第k小元素
41+
else // 如果 k > p, 则需要在arr[p+1...r]中找第k-p-1小元素
42+
// 注意: 由于我们传入__selection的依然是arr, 而不是arr[p+1...r],
43+
// 所以传入的最后一个参数依然是k, 而不是k-p-1
4244
return __selection( arr, p+1, r, k );
4345
}
4446

4547
// 寻找arr数组中第k小的元素
48+
// 注意: 在我们的算法中, k是从0开始索引的, 即最小的元素是第0小元素, 以此类推
49+
// 如果希望我们的算法中k的语意是从1开始的, 只需要在整个逻辑开始进行k--即可, 可以参考selection2
4650
template <typename T>
4751
int selection(T arr[], int n, int k) {
4852

@@ -52,6 +56,14 @@ int selection(T arr[], int n, int k) {
5256
return __selection(arr, 0, n - 1, k);
5357
}
5458

59+
// 寻找arr数组中第k小的元素, k从1开始索引, 即最小元素是第1小元素, 以此类推
60+
template <typename T>
61+
int selection2(T arr[], int n, int k) {
62+
63+
return selection(arr, n, k - 1);
64+
}
65+
66+
5567
// 测试 selection算法
5668
int main() {
5769

@@ -69,5 +81,20 @@ int main() {
6981

7082
delete[] arr;
7183

84+
cout << endl;
85+
86+
// 验证selection2算法
87+
arr = TestHelper::generateOrderedArray(n);
88+
TestHelper::shuffleArray(arr, n);
89+
90+
// 对arr数组求第i小元素, 应该为i - 1 (在selection2中, 第k小元素的k是从1索引的)
91+
for( int i = 1 ; i <= n ; i ++ ){
92+
assert( selection2(arr, n, i) == i - 1 );
93+
cout<<"test "<<i<<" complete."<<endl;
94+
}
95+
cout<<"Test selection2 completed."<<endl;
96+
97+
delete[] arr;
98+
7299
return 0;
73100
}

03-Sorting-Advance/Course Code (Java)/Optional-05-Selection/src/bobo/algo/Selection.java

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,15 +43,25 @@ private static Comparable solve(Comparable[] nums, int l, int r, int k){
4343
return nums[p];
4444
else if( k < p ) // 如果 k < p, 只需要在nums[l...p-1]中找第k小元素即可
4545
return solve( nums, l, p-1, k);
46-
else // 如果 k > p, 则需要在nums[p+1...r]中找第k小元素
46+
else // 如果 k > p, 则需要在nums[p+1...r]中找第k-p-1小元素
47+
// 注意: 由于我们传入__selection的依然是nums, 而不是nums[p+1...r],
48+
// 所以传入的最后一个参数依然是k, 而不是k-p-1
4749
return solve( nums, p+1, r, k );
4850
}
4951

5052
// 寻找nums数组中第k小的元素
51-
public static Comparable solve(Comparable nums[], int n, int k) {
53+
// 注意: 在我们的算法中, k是从0开始索引的, 即最小的元素是第0小元素, 以此类推
54+
// 如果希望我们的算法中k的语意是从1开始的, 只需要在整个逻辑开始进行k--即可, 可以参考solve2
55+
public static Comparable solve(Comparable nums[], int k) {
5256

53-
assert k >= 0 && k < n;
54-
return solve(nums, 0, n - 1, k);
57+
assert nums != null && k >= 0 && k < nums.length;
58+
return solve(nums, 0, nums.length - 1, k);
59+
}
60+
61+
// 寻找nums数组中第k小的元素, k从1开始索引, 即最小元素是第1小元素, 以此类推
62+
public static Comparable solve2(Comparable nums[], int k) {
63+
64+
return Selection.solve(nums, k - 1);
5565
}
5666

5767
private static void swap(Object[] arr, int i, int j) {
@@ -68,11 +78,25 @@ public static void main(String[] args) {
6878
Integer[] arr = TestHelper.generateOrderedArray(N);
6979
TestHelper.shuffleArray(arr);
7080

71-
// 验证selection算法, 对arr数组求第i小元素, 应该为i
81+
// 验证Selection.solve, 对arr数组求第i小元素, 应该为i
82+
for( int i = 0 ; i < N ; i ++ ){
83+
assert solve(arr, i) == i;
84+
System.out.println("test " + i + " complete.");
85+
}
86+
System.out.println("Test Selection.solve completed.");
87+
System.out.println();
88+
89+
90+
arr = TestHelper.generateOrderedArray(N);
91+
TestHelper.shuffleArray(arr);
92+
93+
// 验证Selection.solve2, 对arr数组求第i小元素, 应该为i-1
94+
// 因为在Selection.solve2中, 第k小元素的k是从1索引的
7295
for( int i = 0 ; i < N ; i ++ ){
73-
assert solve(arr, N, i) == i;
96+
assert solve2(arr, i) == i - 1;
7497
System.out.println("test " + i + " complete.");
7598
}
99+
System.out.println("Test Selection.solve2 completed.");
76100

77101
}
78102
}

0 commit comments

Comments
 (0)