@@ -53,9 +53,29 @@ public void checkQuickSelect0Based() {
5353 final long retVal = select (arr , 0 , len - 1 , pivot );
5454 Assert .assertEquals (retVal , trueVal );
5555 }
56+ Assert .assertEquals (select (ascending (len ), 0 , len - 1 , pivot ), trueVal );
57+ Assert .assertEquals (select (descending (len ), 0 , len - 1 , pivot ), trueVal );
5658 }
5759 }
5860
61+ @ Test
62+ public void checkQuickSelect0BasedAllEqual () {
63+ final int len = 64 ;
64+ for (int pivot = 0 ; pivot < len ; pivot ++ ) {
65+ final long [] arr = new long [len ];
66+ java .util .Arrays .fill (arr , 7L );
67+ Assert .assertEquals (select (arr , 0 , len - 1 , pivot ), 7L );
68+ }
69+ }
70+
71+ //Quadratic work still returns the right value, so only the time limit can fail here.
72+ @ Test (timeOut = 10_000 )
73+ public void checkOrderedInputIsNotQuadratic () {
74+ final int len = 1 << 19 ;
75+ Assert .assertEquals (select (ascending (len ), 0 , len - 1 , len / 2 ), len / 2 );
76+ Assert .assertEquals (select (descending (len ), 0 , len - 1 , len / 2 ), len / 2 );
77+ }
78+
5979 @ Test
6080 public void checkQuickSelect1BasedExcludingZeros () {
6181 final int len = 64 ;
@@ -116,9 +136,28 @@ public void checkQuickSelectDbl0Based() {
116136 final double retVal = select (arr , 0 , len - 1 , pivot );
117137 Assert .assertEquals (retVal , trueVal , 0.0 );
118138 }
139+ Assert .assertEquals (select (ascendingDbl (len ), 0 , len - 1 , pivot ), trueVal , 0.0 );
140+ Assert .assertEquals (select (descendingDbl (len ), 0 , len - 1 , pivot ), trueVal , 0.0 );
119141 }
120142 }
121143
144+ @ Test
145+ public void checkQuickSelectDbl0BasedAllEqual () {
146+ final int len = 64 ;
147+ for (int pivot = 0 ; pivot < len ; pivot ++ ) {
148+ final double [] arr = new double [len ];
149+ java .util .Arrays .fill (arr , 7.0 );
150+ Assert .assertEquals (select (arr , 0 , len - 1 , pivot ), 7.0 , 0.0 );
151+ }
152+ }
153+
154+ @ Test (timeOut = 10_000 )
155+ public void checkOrderedInputIsNotQuadraticDbl () {
156+ final int len = 1 << 19 ;
157+ Assert .assertEquals (select (ascendingDbl (len ), 0 , len - 1 , len / 2 ), len / 2 , 0.0 );
158+ Assert .assertEquals (select (descendingDbl (len ), 0 , len - 1 , len / 2 ), len / 2 , 0.0 );
159+ }
160+
122161 @ Test
123162 public void checkQuickSelectDbl1BasedExcludingZeros () {
124163 final int len = 64 ;
@@ -164,6 +203,39 @@ public void checkQuickSelectDbl1BasedIncludingZeros() {
164203 }
165204
166205
206+ //select rearranges its input, so each call needs a fresh array
207+ private static long [] ascending (final int len ) {
208+ final long [] a = new long [len ];
209+ for (int i = 0 ; i < len ; i ++ ) {
210+ a [i ] = i ;
211+ }
212+ return a ;
213+ }
214+
215+ private static long [] descending (final int len ) {
216+ final long [] a = new long [len ];
217+ for (int i = 0 ; i < len ; i ++ ) {
218+ a [i ] = (len - 1 ) - i ;
219+ }
220+ return a ;
221+ }
222+
223+ private static double [] ascendingDbl (final int len ) {
224+ final double [] a = new double [len ];
225+ for (int i = 0 ; i < len ; i ++ ) {
226+ a [i ] = i ;
227+ }
228+ return a ;
229+ }
230+
231+ private static double [] descendingDbl (final int len ) {
232+ final double [] a = new double [len ];
233+ for (int i = 0 ; i < len ; i ++ ) {
234+ a [i ] = (len - 1 ) - i ;
235+ }
236+ return a ;
237+ }
238+
167239 /**
168240 * Rearrange the elements of an array in random order.
169241 * @param a long array
0 commit comments