@@ -43,15 +43,25 @@ private static Comparable solve(Comparable[] nums, int l, int r, int k){
43
43
return nums [p ];
44
44
else if ( k < p ) // 如果 k < p, 只需要在nums[l...p-1]中找第k小元素即可
45
45
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
47
49
return solve ( nums , p +1 , r , k );
48
50
}
49
51
50
52
// 寻找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 ) {
52
56
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 );
55
65
}
56
66
57
67
private static void swap (Object [] arr , int i , int j ) {
@@ -68,11 +78,25 @@ public static void main(String[] args) {
68
78
Integer [] arr = TestHelper .generateOrderedArray (N );
69
79
TestHelper .shuffleArray (arr );
70
80
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索引的
72
95
for ( int i = 0 ; i < N ; i ++ ){
73
- assert solve (arr , N , i ) == i ;
96
+ assert solve2 (arr , i ) == i - 1 ;
74
97
System .out .println ("test " + i + " complete." );
75
98
}
99
+ System .out .println ("Test Selection.solve2 completed." );
76
100
77
101
}
78
102
}
0 commit comments