Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openjdk-multiarch-jdk8u
Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/test/java/util/Arrays/ParallelSorting.java
38811 views
1
/*
2
* Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
*
5
* This code is free software; you can redistribute it and/or modify it
6
* under the terms of the GNU General Public License version 2 only, as
7
* published by the Free Software Foundation.
8
*
9
* This code is distributed in the hope that it will be useful, but WITHOUT
10
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12
* version 2 for more details (a copy is included in the LICENSE file that
13
* accompanied this code).
14
*
15
* You should have received a copy of the GNU General Public License version
16
* 2 along with this work; if not, write to the Free Software Foundation,
17
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18
*
19
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20
* or visit www.oracle.com if you need additional information or have any
21
* questions.
22
*/
23
24
/* Adapted from test/java/util/Arrays/Sorting.java
25
*
26
* Where that test checks Arrays.sort against manual quicksort routines,
27
* this test checks parallelSort against either Arrays.sort or manual
28
* quicksort routines.
29
*/
30
31
/*
32
* @test
33
* @bug 8003981
34
* @run main ParallelSorting -shortrun
35
* @summary Exercise Arrays.parallelSort (adapted from test Sorting)
36
*
37
* @author Vladimir Yaroslavskiy
38
* @author Jon Bentley
39
* @author Josh Bloch
40
*/
41
42
import java.util.Arrays;
43
import java.util.Random;
44
import java.io.PrintStream;
45
import java.util.Comparator;
46
47
public class ParallelSorting {
48
private static final PrintStream out = System.out;
49
private static final PrintStream err = System.err;
50
51
// Array lengths used in a long run (default)
52
private static final int[] LONG_RUN_LENGTHS = {
53
1000, 10000, 100000, 1000000 };
54
55
// Array lengths used in a short run
56
private static final int[] SHORT_RUN_LENGTHS = {
57
5000, 9000, 10000, 12000 };
58
59
// Random initial values used in a long run (default)
60
private static final long[] LONG_RUN_RANDOMS = { 666, 0xC0FFEE, 999 };
61
62
// Random initial values used in a short run
63
private static final long[] SHORT_RUN_RANDOMS = { 666 };
64
65
public static void main(String[] args) {
66
boolean shortRun = args.length > 0 && args[0].equals("-shortrun");
67
long start = System.currentTimeMillis();
68
69
if (shortRun) {
70
testAndCheck(SHORT_RUN_LENGTHS, SHORT_RUN_RANDOMS);
71
} else {
72
testAndCheck(LONG_RUN_LENGTHS, LONG_RUN_RANDOMS);
73
}
74
long end = System.currentTimeMillis();
75
76
out.format("PASSED in %d sec.\n", Math.round((end - start) / 1E3));
77
}
78
79
private static void testAndCheck(int[] lengths, long[] randoms) {
80
testEmptyAndNullIntArray();
81
testEmptyAndNullLongArray();
82
testEmptyAndNullShortArray();
83
testEmptyAndNullCharArray();
84
testEmptyAndNullByteArray();
85
testEmptyAndNullFloatArray();
86
testEmptyAndNullDoubleArray();
87
88
for (int length : lengths) {
89
testMergeSort(length);
90
testAndCheckRange(length);
91
testAndCheckSubArray(length);
92
}
93
for (long seed : randoms) {
94
for (int length : lengths) {
95
testAndCheckWithInsertionSort(length, new MyRandom(seed));
96
testAndCheckWithCheckSum(length, new MyRandom(seed));
97
testAndCheckWithScrambling(length, new MyRandom(seed));
98
testAndCheckFloat(length, new MyRandom(seed));
99
testAndCheckDouble(length, new MyRandom(seed));
100
testStable(length, new MyRandom(seed));
101
}
102
}
103
}
104
105
private static void testEmptyAndNullIntArray() {
106
ourDescription = "Check empty and null array";
107
Arrays.parallelSort(new int[]{});
108
Arrays.parallelSort(new int[]{}, 0, 0);
109
110
try {
111
Arrays.parallelSort((int[]) null);
112
} catch (NullPointerException expected) {
113
try {
114
Arrays.parallelSort((int[]) null, 0, 0);
115
} catch (NullPointerException expected2) {
116
return;
117
}
118
failed("Arrays.parallelSort(int[],fromIndex,toIndex) shouldn't " +
119
"catch null array");
120
}
121
failed("Arrays.parallelSort(int[]) shouldn't catch null array");
122
}
123
124
private static void testEmptyAndNullLongArray() {
125
ourDescription = "Check empty and null array";
126
Arrays.parallelSort(new long[]{});
127
Arrays.parallelSort(new long[]{}, 0, 0);
128
129
try {
130
Arrays.parallelSort((long[]) null);
131
} catch (NullPointerException expected) {
132
try {
133
Arrays.parallelSort((long[]) null, 0, 0);
134
} catch (NullPointerException expected2) {
135
return;
136
}
137
failed("Arrays.parallelSort(long[],fromIndex,toIndex) shouldn't " +
138
"catch null array");
139
}
140
failed("Arrays.parallelSort(long[]) shouldn't catch null array");
141
}
142
143
private static void testEmptyAndNullShortArray() {
144
ourDescription = "Check empty and null array";
145
Arrays.parallelSort(new short[]{});
146
Arrays.parallelSort(new short[]{}, 0, 0);
147
148
try {
149
Arrays.parallelSort((short[]) null);
150
} catch (NullPointerException expected) {
151
try {
152
Arrays.parallelSort((short[]) null, 0, 0);
153
} catch (NullPointerException expected2) {
154
return;
155
}
156
failed("Arrays.parallelSort(short[],fromIndex,toIndex) shouldn't " +
157
"catch null array");
158
}
159
failed("Arrays.parallelSort(short[]) shouldn't catch null array");
160
}
161
162
private static void testEmptyAndNullCharArray() {
163
ourDescription = "Check empty and null array";
164
Arrays.parallelSort(new char[]{});
165
Arrays.parallelSort(new char[]{}, 0, 0);
166
167
try {
168
Arrays.parallelSort((char[]) null);
169
} catch (NullPointerException expected) {
170
try {
171
Arrays.parallelSort((char[]) null, 0, 0);
172
} catch (NullPointerException expected2) {
173
return;
174
}
175
failed("Arrays.parallelSort(char[],fromIndex,toIndex) shouldn't " +
176
"catch null array");
177
}
178
failed("Arrays.parallelSort(char[]) shouldn't catch null array");
179
}
180
181
private static void testEmptyAndNullByteArray() {
182
ourDescription = "Check empty and null array";
183
Arrays.parallelSort(new byte[]{});
184
Arrays.parallelSort(new byte[]{}, 0, 0);
185
186
try {
187
Arrays.parallelSort((byte[]) null);
188
} catch (NullPointerException expected) {
189
try {
190
Arrays.parallelSort((byte[]) null, 0, 0);
191
} catch (NullPointerException expected2) {
192
return;
193
}
194
failed("Arrays.parallelSort(byte[],fromIndex,toIndex) shouldn't " +
195
"catch null array");
196
}
197
failed("Arrays.parallelSort(byte[]) shouldn't catch null array");
198
}
199
200
private static void testEmptyAndNullFloatArray() {
201
ourDescription = "Check empty and null array";
202
Arrays.parallelSort(new float[]{});
203
Arrays.parallelSort(new float[]{}, 0, 0);
204
205
try {
206
Arrays.parallelSort((float[]) null);
207
} catch (NullPointerException expected) {
208
try {
209
Arrays.parallelSort((float[]) null, 0, 0);
210
} catch (NullPointerException expected2) {
211
return;
212
}
213
failed("Arrays.parallelSort(float[],fromIndex,toIndex) shouldn't " +
214
"catch null array");
215
}
216
failed("Arrays.parallelSort(float[]) shouldn't catch null array");
217
}
218
219
private static void testEmptyAndNullDoubleArray() {
220
ourDescription = "Check empty and null array";
221
Arrays.parallelSort(new double[]{});
222
Arrays.parallelSort(new double[]{}, 0, 0);
223
224
try {
225
Arrays.parallelSort((double[]) null);
226
} catch (NullPointerException expected) {
227
try {
228
Arrays.parallelSort((double[]) null, 0, 0);
229
} catch (NullPointerException expected2) {
230
return;
231
}
232
failed("Arrays.parallelSort(double[],fromIndex,toIndex) shouldn't " +
233
"catch null array");
234
}
235
failed("Arrays.parallelSort(double[]) shouldn't catch null array");
236
}
237
238
private static void testAndCheckSubArray(int length) {
239
ourDescription = "Check sorting of subarray";
240
int[] golden = new int[length];
241
boolean newLine = false;
242
243
for (int m = 1; m < length / 2; m *= 2) {
244
newLine = true;
245
int fromIndex = m;
246
int toIndex = length - m;
247
248
prepareSubArray(golden, fromIndex, toIndex, m);
249
int[] test = golden.clone();
250
251
for (TypeConverter converter : TypeConverter.values()) {
252
out.println("Test 'subarray': " + converter +
253
" length = " + length + ", m = " + m);
254
Object convertedGolden = converter.convert(golden);
255
Object convertedTest = converter.convert(test);
256
sortSubArray(convertedTest, fromIndex, toIndex);
257
checkSubArray(convertedTest, fromIndex, toIndex, m);
258
}
259
}
260
if (newLine) {
261
out.println();
262
}
263
}
264
265
private static void testAndCheckRange(int length) {
266
ourDescription = "Check range check";
267
int[] golden = new int[length];
268
269
for (int m = 1; m < 2 * length; m *= 2) {
270
for (int i = 1; i <= length; i++) {
271
golden[i - 1] = i % m + m % i;
272
}
273
for (TypeConverter converter : TypeConverter.values()) {
274
out.println("Test 'range': " + converter +
275
", length = " + length + ", m = " + m);
276
Object convertedGolden = converter.convert(golden);
277
checkRange(convertedGolden, m);
278
}
279
}
280
out.println();
281
}
282
283
private static void testStable(int length, MyRandom random) {
284
ourDescription = "Check if sorting is stable";
285
Pair[] a = build(length, random);
286
287
out.println("Test 'stable': " + "random = " + random.getSeed() +
288
", length = " + length);
289
Arrays.parallelSort(a);
290
checkSorted(a);
291
checkStable(a);
292
out.println();
293
294
a = build(length, random);
295
296
out.println("Test 'stable' comparator: " + "random = " + random.getSeed() +
297
", length = " + length);
298
Arrays.parallelSort(a, pairCmp);
299
checkSorted(a);
300
checkStable(a);
301
out.println();
302
303
}
304
305
private static void checkSorted(Pair[] a) {
306
for (int i = 0; i < a.length - 1; i++) {
307
if (a[i].getKey() > a[i + 1].getKey()) {
308
failedSort(i, "" + a[i].getKey(), "" + a[i + 1].getKey());
309
}
310
}
311
}
312
313
private static void checkStable(Pair[] a) {
314
for (int i = 0; i < a.length / 4; ) {
315
int key1 = a[i].getKey();
316
int value1 = a[i++].getValue();
317
int key2 = a[i].getKey();
318
int value2 = a[i++].getValue();
319
int key3 = a[i].getKey();
320
int value3 = a[i++].getValue();
321
int key4 = a[i].getKey();
322
int value4 = a[i++].getValue();
323
324
if (!(key1 == key2 && key2 == key3 && key3 == key4)) {
325
failed("On position " + i + " keys are different " +
326
key1 + ", " + key2 + ", " + key3 + ", " + key4);
327
}
328
if (!(value1 < value2 && value2 < value3 && value3 < value4)) {
329
failed("Sorting is not stable at position " + i +
330
". Second values have been changed: " + value1 + ", " +
331
value2 + ", " + value3 + ", " + value4);
332
}
333
}
334
}
335
336
private static Pair[] build(int length, Random random) {
337
Pair[] a = new Pair[length * 4];
338
339
for (int i = 0; i < a.length; ) {
340
int key = random.nextInt();
341
a[i++] = new Pair(key, 1);
342
a[i++] = new Pair(key, 2);
343
a[i++] = new Pair(key, 3);
344
a[i++] = new Pair(key, 4);
345
}
346
return a;
347
}
348
349
private static Comparator<Pair> pairCmp = new Comparator<Pair>() {
350
public int compare(Pair p1, Pair p2) {
351
return p1.compareTo(p2);
352
}
353
};
354
355
private static final class Pair implements Comparable<Pair> {
356
Pair(int key, int value) {
357
myKey = key;
358
myValue = value;
359
}
360
361
int getKey() {
362
return myKey;
363
}
364
365
int getValue() {
366
return myValue;
367
}
368
369
public int compareTo(Pair pair) {
370
if (myKey < pair.myKey) {
371
return -1;
372
}
373
if (myKey > pair.myKey) {
374
return 1;
375
}
376
return 0;
377
}
378
379
@Override
380
public String toString() {
381
return "(" + myKey + ", " + myValue + ")";
382
}
383
384
private int myKey;
385
private int myValue;
386
}
387
388
389
private static void testAndCheckWithInsertionSort(int length, MyRandom random) {
390
if (length > 1000) {
391
return;
392
}
393
ourDescription = "Check sorting with insertion sort";
394
int[] golden = new int[length];
395
396
for (int m = 1; m < 2 * length; m *= 2) {
397
for (UnsortedBuilder builder : UnsortedBuilder.values()) {
398
builder.build(golden, m, random);
399
int[] test = golden.clone();
400
401
for (TypeConverter converter : TypeConverter.values()) {
402
out.println("Test 'insertion sort': " + converter +
403
" " + builder + "random = " + random.getSeed() +
404
", length = " + length + ", m = " + m);
405
Object convertedGolden = converter.convert(golden);
406
Object convertedTest1 = converter.convert(test);
407
Object convertedTest2 = converter.convert(test);
408
sort(convertedTest1);
409
sortByInsertionSort(convertedTest2);
410
compare(convertedTest1, convertedTest2);
411
}
412
}
413
}
414
out.println();
415
}
416
417
private static void testMergeSort(int length) {
418
if (length < 1000) {
419
return;
420
}
421
ourDescription = "Check merge sorting";
422
int[] golden = new int[length];
423
int period = 67; // java.util.DualPivotQuicksort.MAX_RUN_COUNT
424
425
for (int m = period - 2; m <= period + 2; m++) {
426
for (MergeBuilder builder : MergeBuilder.values()) {
427
builder.build(golden, m);
428
int[] test = golden.clone();
429
430
for (TypeConverter converter : TypeConverter.values()) {
431
out.println("Test 'merge sort': " + converter + " " +
432
builder + "length = " + length + ", m = " + m);
433
Object convertedGolden = converter.convert(golden);
434
sort(convertedGolden);
435
checkSorted(convertedGolden);
436
}
437
}
438
}
439
out.println();
440
}
441
442
private static void testAndCheckWithCheckSum(int length, MyRandom random) {
443
ourDescription = "Check sorting with check sum";
444
int[] golden = new int[length];
445
446
for (int m = 1; m < 2 * length; m *= 2) {
447
for (UnsortedBuilder builder : UnsortedBuilder.values()) {
448
builder.build(golden, m, random);
449
int[] test = golden.clone();
450
451
for (TypeConverter converter : TypeConverter.values()) {
452
out.println("Test 'check sum': " + converter +
453
" " + builder + "random = " + random.getSeed() +
454
", length = " + length + ", m = " + m);
455
Object convertedGolden = converter.convert(golden);
456
Object convertedTest = converter.convert(test);
457
sort(convertedTest);
458
checkWithCheckSum(convertedTest, convertedGolden);
459
}
460
}
461
}
462
out.println();
463
}
464
465
private static void testAndCheckWithScrambling(int length, MyRandom random) {
466
ourDescription = "Check sorting with scrambling";
467
int[] golden = new int[length];
468
469
for (int m = 1; m <= 7; m++) {
470
if (m > length) {
471
break;
472
}
473
for (SortedBuilder builder : SortedBuilder.values()) {
474
builder.build(golden, m);
475
int[] test = golden.clone();
476
scramble(test, random);
477
478
for (TypeConverter converter : TypeConverter.values()) {
479
out.println("Test 'scrambling': " + converter +
480
" " + builder + "random = " + random.getSeed() +
481
", length = " + length + ", m = " + m);
482
Object convertedGolden = converter.convert(golden);
483
Object convertedTest = converter.convert(test);
484
sort(convertedTest);
485
compare(convertedTest, convertedGolden);
486
}
487
}
488
}
489
out.println();
490
}
491
492
private static void testAndCheckFloat(int length, MyRandom random) {
493
ourDescription = "Check float sorting";
494
float[] golden = new float[length];
495
final int MAX = 10;
496
boolean newLine = false;
497
498
for (int a = 0; a <= MAX; a++) {
499
for (int g = 0; g <= MAX; g++) {
500
for (int z = 0; z <= MAX; z++) {
501
for (int n = 0; n <= MAX; n++) {
502
for (int p = 0; p <= MAX; p++) {
503
if (a + g + z + n + p > length) {
504
continue;
505
}
506
if (a + g + z + n + p < length) {
507
continue;
508
}
509
for (FloatBuilder builder : FloatBuilder.values()) {
510
out.println("Test 'float': random = " + random.getSeed() +
511
", length = " + length + ", a = " + a + ", g = " +
512
g + ", z = " + z + ", n = " + n + ", p = " + p);
513
builder.build(golden, a, g, z, n, p, random);
514
float[] test = golden.clone();
515
scramble(test, random);
516
sort(test);
517
compare(test, golden, a, n, g);
518
}
519
newLine = true;
520
}
521
}
522
}
523
}
524
}
525
if (newLine) {
526
out.println();
527
}
528
}
529
530
private static void testAndCheckDouble(int length, MyRandom random) {
531
ourDescription = "Check double sorting";
532
double[] golden = new double[length];
533
final int MAX = 10;
534
boolean newLine = false;
535
536
for (int a = 0; a <= MAX; a++) {
537
for (int g = 0; g <= MAX; g++) {
538
for (int z = 0; z <= MAX; z++) {
539
for (int n = 0; n <= MAX; n++) {
540
for (int p = 0; p <= MAX; p++) {
541
if (a + g + z + n + p > length) {
542
continue;
543
}
544
if (a + g + z + n + p < length) {
545
continue;
546
}
547
for (DoubleBuilder builder : DoubleBuilder.values()) {
548
out.println("Test 'double': random = " + random.getSeed() +
549
", length = " + length + ", a = " + a + ", g = " +
550
g + ", z = " + z + ", n = " + n + ", p = " + p);
551
builder.build(golden, a, g, z, n, p, random);
552
double[] test = golden.clone();
553
scramble(test, random);
554
sort(test);
555
compare(test, golden, a, n, g);
556
}
557
newLine = true;
558
}
559
}
560
}
561
}
562
}
563
if (newLine) {
564
out.println();
565
}
566
}
567
568
private static void prepareSubArray(int[] a, int fromIndex, int toIndex, int m) {
569
for (int i = 0; i < fromIndex; i++) {
570
a[i] = 0xDEDA;
571
}
572
int middle = (fromIndex + toIndex) >>> 1;
573
int k = 0;
574
575
for (int i = fromIndex; i < middle; i++) {
576
a[i] = k++;
577
}
578
for (int i = middle; i < toIndex; i++) {
579
a[i] = k--;
580
}
581
for (int i = toIndex; i < a.length; i++) {
582
a[i] = 0xBABA;
583
}
584
}
585
586
private static void scramble(int[] a, Random random) {
587
for (int i = 0; i < a.length * 7; i++) {
588
swap(a, random.nextInt(a.length), random.nextInt(a.length));
589
}
590
}
591
592
private static void scramble(float[] a, Random random) {
593
for (int i = 0; i < a.length * 7; i++) {
594
swap(a, random.nextInt(a.length), random.nextInt(a.length));
595
}
596
}
597
598
private static void scramble(double[] a, Random random) {
599
for (int i = 0; i < a.length * 7; i++) {
600
swap(a, random.nextInt(a.length), random.nextInt(a.length));
601
}
602
}
603
604
private static void swap(int[] a, int i, int j) {
605
int t = a[i];
606
a[i] = a[j];
607
a[j] = t;
608
}
609
610
private static void swap(float[] a, int i, int j) {
611
float t = a[i];
612
a[i] = a[j];
613
a[j] = t;
614
}
615
616
private static void swap(double[] a, int i, int j) {
617
double t = a[i];
618
a[i] = a[j];
619
a[j] = t;
620
}
621
622
private static enum TypeConverter {
623
INT {
624
Object convert(int[] a) {
625
return a.clone();
626
}
627
},
628
LONG {
629
Object convert(int[] a) {
630
long[] b = new long[a.length];
631
632
for (int i = 0; i < a.length; i++) {
633
b[i] = (long) a[i];
634
}
635
return b;
636
}
637
},
638
BYTE {
639
Object convert(int[] a) {
640
byte[] b = new byte[a.length];
641
642
for (int i = 0; i < a.length; i++) {
643
b[i] = (byte) a[i];
644
}
645
return b;
646
}
647
},
648
SHORT {
649
Object convert(int[] a) {
650
short[] b = new short[a.length];
651
652
for (int i = 0; i < a.length; i++) {
653
b[i] = (short) a[i];
654
}
655
return b;
656
}
657
},
658
CHAR {
659
Object convert(int[] a) {
660
char[] b = new char[a.length];
661
662
for (int i = 0; i < a.length; i++) {
663
b[i] = (char) a[i];
664
}
665
return b;
666
}
667
},
668
FLOAT {
669
Object convert(int[] a) {
670
float[] b = new float[a.length];
671
672
for (int i = 0; i < a.length; i++) {
673
b[i] = (float) a[i];
674
}
675
return b;
676
}
677
},
678
DOUBLE {
679
Object convert(int[] a) {
680
double[] b = new double[a.length];
681
682
for (int i = 0; i < a.length; i++) {
683
b[i] = (double) a[i];
684
}
685
return b;
686
}
687
},
688
INTEGER {
689
Object convert(int[] a) {
690
Integer[] b = new Integer[a.length];
691
692
for (int i = 0; i < a.length; i++) {
693
b[i] = new Integer(a[i]);
694
}
695
return b;
696
}
697
};
698
699
abstract Object convert(int[] a);
700
701
@Override public String toString() {
702
String name = name();
703
704
for (int i = name.length(); i < 9; i++) {
705
name += " ";
706
}
707
return name;
708
}
709
}
710
711
private static enum FloatBuilder {
712
SIMPLE {
713
void build(float[] x, int a, int g, int z, int n, int p, Random random) {
714
int fromIndex = 0;
715
float negativeValue = -random.nextFloat();
716
float positiveValue = random.nextFloat();
717
718
writeValue(x, negativeValue, fromIndex, n);
719
fromIndex += n;
720
721
writeValue(x, -0.0f, fromIndex, g);
722
fromIndex += g;
723
724
writeValue(x, 0.0f, fromIndex, z);
725
fromIndex += z;
726
727
writeValue(x, positiveValue, fromIndex, p);
728
fromIndex += p;
729
730
writeValue(x, Float.NaN, fromIndex, a);
731
}
732
};
733
734
abstract void build(float[] x, int a, int g, int z, int n, int p, Random random);
735
}
736
737
private static enum DoubleBuilder {
738
SIMPLE {
739
void build(double[] x, int a, int g, int z, int n, int p, Random random) {
740
int fromIndex = 0;
741
double negativeValue = -random.nextFloat();
742
double positiveValue = random.nextFloat();
743
744
writeValue(x, negativeValue, fromIndex, n);
745
fromIndex += n;
746
747
writeValue(x, -0.0d, fromIndex, g);
748
fromIndex += g;
749
750
writeValue(x, 0.0d, fromIndex, z);
751
fromIndex += z;
752
753
writeValue(x, positiveValue, fromIndex, p);
754
fromIndex += p;
755
756
writeValue(x, Double.NaN, fromIndex, a);
757
}
758
};
759
760
abstract void build(double[] x, int a, int g, int z, int n, int p, Random random);
761
}
762
763
private static void writeValue(float[] a, float value, int fromIndex, int count) {
764
for (int i = fromIndex; i < fromIndex + count; i++) {
765
a[i] = value;
766
}
767
}
768
769
private static void compare(float[] a, float[] b, int numNaN, int numNeg, int numNegZero) {
770
for (int i = a.length - numNaN; i < a.length; i++) {
771
if (a[i] == a[i]) {
772
failed("On position " + i + " must be NaN instead of " + a[i]);
773
}
774
}
775
final int NEGATIVE_ZERO = Float.floatToIntBits(-0.0f);
776
777
for (int i = numNeg; i < numNeg + numNegZero; i++) {
778
if (NEGATIVE_ZERO != Float.floatToIntBits(a[i])) {
779
failed("On position " + i + " must be -0.0 instead of " + a[i]);
780
}
781
}
782
for (int i = 0; i < a.length - numNaN; i++) {
783
if (a[i] != b[i]) {
784
failedCompare(i, "" + a[i], "" + b[i]);
785
}
786
}
787
}
788
789
private static void writeValue(double[] a, double value, int fromIndex, int count) {
790
for (int i = fromIndex; i < fromIndex + count; i++) {
791
a[i] = value;
792
}
793
}
794
795
private static void compare(double[] a, double[] b, int numNaN, int numNeg, int numNegZero) {
796
for (int i = a.length - numNaN; i < a.length; i++) {
797
if (a[i] == a[i]) {
798
failed("On position " + i + " must be NaN instead of " + a[i]);
799
}
800
}
801
final long NEGATIVE_ZERO = Double.doubleToLongBits(-0.0d);
802
803
for (int i = numNeg; i < numNeg + numNegZero; i++) {
804
if (NEGATIVE_ZERO != Double.doubleToLongBits(a[i])) {
805
failed("On position " + i + " must be -0.0 instead of " + a[i]);
806
}
807
}
808
for (int i = 0; i < a.length - numNaN; i++) {
809
if (a[i] != b[i]) {
810
failedCompare(i, "" + a[i], "" + b[i]);
811
}
812
}
813
}
814
815
private static enum SortedBuilder {
816
REPEATED {
817
void build(int[] a, int m) {
818
int period = a.length / m;
819
int i = 0;
820
int k = 0;
821
822
while (true) {
823
for (int t = 1; t <= period; t++) {
824
if (i >= a.length) {
825
return;
826
}
827
a[i++] = k;
828
}
829
if (i >= a.length) {
830
return;
831
}
832
k++;
833
}
834
}
835
},
836
ORGAN_PIPES {
837
void build(int[] a, int m) {
838
int i = 0;
839
int k = m;
840
841
while (true) {
842
for (int t = 1; t <= m; t++) {
843
if (i >= a.length) {
844
return;
845
}
846
a[i++] = k;
847
}
848
}
849
}
850
};
851
852
abstract void build(int[] a, int m);
853
854
@Override public String toString() {
855
String name = name();
856
857
for (int i = name.length(); i < 12; i++) {
858
name += " ";
859
}
860
return name;
861
}
862
}
863
864
private static enum MergeBuilder {
865
ASCENDING {
866
void build(int[] a, int m) {
867
int period = a.length / m;
868
int v = 1, i = 0;
869
870
for (int k = 0; k < m; k++) {
871
v = 1;
872
for (int p = 0; p < period; p++) {
873
a[i++] = v++;
874
}
875
}
876
for (int j = i; j < a.length - 1; j++) {
877
a[j] = v++;
878
}
879
a[a.length - 1] = 0;
880
}
881
},
882
DESCENDING {
883
void build(int[] a, int m) {
884
int period = a.length / m;
885
int v = -1, i = 0;
886
887
for (int k = 0; k < m; k++) {
888
v = -1;
889
for (int p = 0; p < period; p++) {
890
a[i++] = v--;
891
}
892
}
893
for (int j = i; j < a.length - 1; j++) {
894
a[j] = v--;
895
}
896
a[a.length - 1] = 0;
897
}
898
};
899
900
abstract void build(int[] a, int m);
901
902
@Override public String toString() {
903
String name = name();
904
905
for (int i = name.length(); i < 12; i++) {
906
name += " ";
907
}
908
return name;
909
}
910
}
911
912
private static enum UnsortedBuilder {
913
RANDOM {
914
void build(int[] a, int m, Random random) {
915
for (int i = 0; i < a.length; i++) {
916
a[i] = random.nextInt();
917
}
918
}
919
},
920
ASCENDING {
921
void build(int[] a, int m, Random random) {
922
for (int i = 0; i < a.length; i++) {
923
a[i] = m + i;
924
}
925
}
926
},
927
DESCENDING {
928
void build(int[] a, int m, Random random) {
929
for (int i = 0; i < a.length; i++) {
930
a[i] = a.length - m - i;
931
}
932
}
933
},
934
ALL_EQUAL {
935
void build(int[] a, int m, Random random) {
936
for (int i = 0; i < a.length; i++) {
937
a[i] = m;
938
}
939
}
940
},
941
SAW {
942
void build(int[] a, int m, Random random) {
943
int incCount = 1;
944
int decCount = a.length;
945
int i = 0;
946
int period = m--;
947
948
while (true) {
949
for (int k = 1; k <= period; k++) {
950
if (i >= a.length) {
951
return;
952
}
953
a[i++] = incCount++;
954
}
955
period += m;
956
957
for (int k = 1; k <= period; k++) {
958
if (i >= a.length) {
959
return;
960
}
961
a[i++] = decCount--;
962
}
963
period += m;
964
}
965
}
966
},
967
REPEATED {
968
void build(int[] a, int m, Random random) {
969
for (int i = 0; i < a.length; i++) {
970
a[i] = i % m;
971
}
972
}
973
},
974
DUPLICATED {
975
void build(int[] a, int m, Random random) {
976
for (int i = 0; i < a.length; i++) {
977
a[i] = random.nextInt(m);
978
}
979
}
980
},
981
ORGAN_PIPES {
982
void build(int[] a, int m, Random random) {
983
int middle = a.length / (m + 1);
984
985
for (int i = 0; i < middle; i++) {
986
a[i] = i;
987
}
988
for (int i = middle; i < a.length; i++) {
989
a[i] = a.length - i - 1;
990
}
991
}
992
},
993
STAGGER {
994
void build(int[] a, int m, Random random) {
995
for (int i = 0; i < a.length; i++) {
996
a[i] = (i * m + i) % a.length;
997
}
998
}
999
},
1000
PLATEAU {
1001
void build(int[] a, int m, Random random) {
1002
for (int i = 0; i < a.length; i++) {
1003
a[i] = Math.min(i, m);
1004
}
1005
}
1006
},
1007
SHUFFLE {
1008
void build(int[] a, int m, Random random) {
1009
int x = 0, y = 0;
1010
for (int i = 0; i < a.length; i++) {
1011
a[i] = random.nextBoolean() ? (x += 2) : (y += 2);
1012
}
1013
}
1014
};
1015
1016
abstract void build(int[] a, int m, Random random);
1017
1018
@Override public String toString() {
1019
String name = name();
1020
1021
for (int i = name.length(); i < 12; i++) {
1022
name += " ";
1023
}
1024
return name;
1025
}
1026
}
1027
1028
private static void checkWithCheckSum(Object test, Object golden) {
1029
checkSorted(test);
1030
checkCheckSum(test, golden);
1031
}
1032
1033
private static void failed(String message) {
1034
err.format("\n*** TEST FAILED - %s.\n\n%s.\n\n", ourDescription, message);
1035
throw new RuntimeException("Test failed - see log file for details");
1036
}
1037
1038
private static void failedSort(int index, String value1, String value2) {
1039
failed("Array is not sorted at " + index + "-th position: " +
1040
value1 + " and " + value2);
1041
}
1042
1043
private static void failedCompare(int index, String value1, String value2) {
1044
failed("On position " + index + " must be " + value2 + " instead of " + value1);
1045
}
1046
1047
private static void compare(Object test, Object golden) {
1048
if (test instanceof int[]) {
1049
compare((int[]) test, (int[]) golden);
1050
} else if (test instanceof long[]) {
1051
compare((long[]) test, (long[]) golden);
1052
} else if (test instanceof short[]) {
1053
compare((short[]) test, (short[]) golden);
1054
} else if (test instanceof byte[]) {
1055
compare((byte[]) test, (byte[]) golden);
1056
} else if (test instanceof char[]) {
1057
compare((char[]) test, (char[]) golden);
1058
} else if (test instanceof float[]) {
1059
compare((float[]) test, (float[]) golden);
1060
} else if (test instanceof double[]) {
1061
compare((double[]) test, (double[]) golden);
1062
} else if (test instanceof Integer[]) {
1063
compare((Integer[]) test, (Integer[]) golden);
1064
} else {
1065
failed("Unknow type of array: " + test + " of class " +
1066
test.getClass().getName());
1067
}
1068
}
1069
1070
private static void compare(int[] a, int[] b) {
1071
for (int i = 0; i < a.length; i++) {
1072
if (a[i] != b[i]) {
1073
failedCompare(i, "" + a[i], "" + b[i]);
1074
}
1075
}
1076
}
1077
1078
private static void compare(long[] a, long[] b) {
1079
for (int i = 0; i < a.length; i++) {
1080
if (a[i] != b[i]) {
1081
failedCompare(i, "" + a[i], "" + b[i]);
1082
}
1083
}
1084
}
1085
1086
private static void compare(short[] a, short[] b) {
1087
for (int i = 0; i < a.length; i++) {
1088
if (a[i] != b[i]) {
1089
failedCompare(i, "" + a[i], "" + b[i]);
1090
}
1091
}
1092
}
1093
1094
private static void compare(byte[] a, byte[] b) {
1095
for (int i = 0; i < a.length; i++) {
1096
if (a[i] != b[i]) {
1097
failedCompare(i, "" + a[i], "" + b[i]);
1098
}
1099
}
1100
}
1101
1102
private static void compare(char[] a, char[] b) {
1103
for (int i = 0; i < a.length; i++) {
1104
if (a[i] != b[i]) {
1105
failedCompare(i, "" + a[i], "" + b[i]);
1106
}
1107
}
1108
}
1109
1110
private static void compare(float[] a, float[] b) {
1111
for (int i = 0; i < a.length; i++) {
1112
if (a[i] != b[i]) {
1113
failedCompare(i, "" + a[i], "" + b[i]);
1114
}
1115
}
1116
}
1117
1118
private static void compare(double[] a, double[] b) {
1119
for (int i = 0; i < a.length; i++) {
1120
if (a[i] != b[i]) {
1121
failedCompare(i, "" + a[i], "" + b[i]);
1122
}
1123
}
1124
}
1125
1126
private static void compare(Integer[] a, Integer[] b) {
1127
for (int i = 0; i < a.length; i++) {
1128
if (a[i].compareTo(b[i]) != 0) {
1129
failedCompare(i, "" + a[i], "" + b[i]);
1130
}
1131
}
1132
}
1133
1134
private static void checkSorted(Object object) {
1135
if (object instanceof int[]) {
1136
checkSorted((int[]) object);
1137
} else if (object instanceof long[]) {
1138
checkSorted((long[]) object);
1139
} else if (object instanceof short[]) {
1140
checkSorted((short[]) object);
1141
} else if (object instanceof byte[]) {
1142
checkSorted((byte[]) object);
1143
} else if (object instanceof char[]) {
1144
checkSorted((char[]) object);
1145
} else if (object instanceof float[]) {
1146
checkSorted((float[]) object);
1147
} else if (object instanceof double[]) {
1148
checkSorted((double[]) object);
1149
} else if (object instanceof Integer[]) {
1150
checkSorted((Integer[]) object);
1151
} else {
1152
failed("Unknow type of array: " + object + " of class " +
1153
object.getClass().getName());
1154
}
1155
}
1156
1157
private static void checkSorted(int[] a) {
1158
for (int i = 0; i < a.length - 1; i++) {
1159
if (a[i] > a[i + 1]) {
1160
failedSort(i, "" + a[i], "" + a[i + 1]);
1161
}
1162
}
1163
}
1164
1165
private static void checkSorted(long[] a) {
1166
for (int i = 0; i < a.length - 1; i++) {
1167
if (a[i] > a[i + 1]) {
1168
failedSort(i, "" + a[i], "" + a[i + 1]);
1169
}
1170
}
1171
}
1172
1173
private static void checkSorted(short[] a) {
1174
for (int i = 0; i < a.length - 1; i++) {
1175
if (a[i] > a[i + 1]) {
1176
failedSort(i, "" + a[i], "" + a[i + 1]);
1177
}
1178
}
1179
}
1180
1181
private static void checkSorted(byte[] a) {
1182
for (int i = 0; i < a.length - 1; i++) {
1183
if (a[i] > a[i + 1]) {
1184
failedSort(i, "" + a[i], "" + a[i + 1]);
1185
}
1186
}
1187
}
1188
1189
private static void checkSorted(char[] a) {
1190
for (int i = 0; i < a.length - 1; i++) {
1191
if (a[i] > a[i + 1]) {
1192
failedSort(i, "" + a[i], "" + a[i + 1]);
1193
}
1194
}
1195
}
1196
1197
private static void checkSorted(float[] a) {
1198
for (int i = 0; i < a.length - 1; i++) {
1199
if (a[i] > a[i + 1]) {
1200
failedSort(i, "" + a[i], "" + a[i + 1]);
1201
}
1202
}
1203
}
1204
1205
private static void checkSorted(double[] a) {
1206
for (int i = 0; i < a.length - 1; i++) {
1207
if (a[i] > a[i + 1]) {
1208
failedSort(i, "" + a[i], "" + a[i + 1]);
1209
}
1210
}
1211
}
1212
1213
private static void checkSorted(Integer[] a) {
1214
for (int i = 0; i < a.length - 1; i++) {
1215
if (a[i].intValue() > a[i + 1].intValue()) {
1216
failedSort(i, "" + a[i], "" + a[i + 1]);
1217
}
1218
}
1219
}
1220
1221
private static void checkCheckSum(Object test, Object golden) {
1222
if (checkSumXor(test) != checkSumXor(golden)) {
1223
failed("Original and sorted arrays are not identical [xor]");
1224
}
1225
if (checkSumPlus(test) != checkSumPlus(golden)) {
1226
failed("Original and sorted arrays are not identical [plus]");
1227
}
1228
}
1229
1230
private static int checkSumXor(Object object) {
1231
if (object instanceof int[]) {
1232
return checkSumXor((int[]) object);
1233
} else if (object instanceof long[]) {
1234
return checkSumXor((long[]) object);
1235
} else if (object instanceof short[]) {
1236
return checkSumXor((short[]) object);
1237
} else if (object instanceof byte[]) {
1238
return checkSumXor((byte[]) object);
1239
} else if (object instanceof char[]) {
1240
return checkSumXor((char[]) object);
1241
} else if (object instanceof float[]) {
1242
return checkSumXor((float[]) object);
1243
} else if (object instanceof double[]) {
1244
return checkSumXor((double[]) object);
1245
} else if (object instanceof Integer[]) {
1246
return checkSumXor((Integer[]) object);
1247
} else {
1248
failed("Unknow type of array: " + object + " of class " +
1249
object.getClass().getName());
1250
return -1;
1251
}
1252
}
1253
1254
private static int checkSumXor(Integer[] a) {
1255
int checkSum = 0;
1256
1257
for (Integer e : a) {
1258
checkSum ^= e.intValue();
1259
}
1260
return checkSum;
1261
}
1262
1263
private static int checkSumXor(int[] a) {
1264
int checkSum = 0;
1265
1266
for (int e : a) {
1267
checkSum ^= e;
1268
}
1269
return checkSum;
1270
}
1271
1272
private static int checkSumXor(long[] a) {
1273
long checkSum = 0;
1274
1275
for (long e : a) {
1276
checkSum ^= e;
1277
}
1278
return (int) checkSum;
1279
}
1280
1281
private static int checkSumXor(short[] a) {
1282
short checkSum = 0;
1283
1284
for (short e : a) {
1285
checkSum ^= e;
1286
}
1287
return (int) checkSum;
1288
}
1289
1290
private static int checkSumXor(byte[] a) {
1291
byte checkSum = 0;
1292
1293
for (byte e : a) {
1294
checkSum ^= e;
1295
}
1296
return (int) checkSum;
1297
}
1298
1299
private static int checkSumXor(char[] a) {
1300
char checkSum = 0;
1301
1302
for (char e : a) {
1303
checkSum ^= e;
1304
}
1305
return (int) checkSum;
1306
}
1307
1308
private static int checkSumXor(float[] a) {
1309
int checkSum = 0;
1310
1311
for (float e : a) {
1312
checkSum ^= (int) e;
1313
}
1314
return checkSum;
1315
}
1316
1317
private static int checkSumXor(double[] a) {
1318
int checkSum = 0;
1319
1320
for (double e : a) {
1321
checkSum ^= (int) e;
1322
}
1323
return checkSum;
1324
}
1325
1326
private static int checkSumPlus(Object object) {
1327
if (object instanceof int[]) {
1328
return checkSumPlus((int[]) object);
1329
} else if (object instanceof long[]) {
1330
return checkSumPlus((long[]) object);
1331
} else if (object instanceof short[]) {
1332
return checkSumPlus((short[]) object);
1333
} else if (object instanceof byte[]) {
1334
return checkSumPlus((byte[]) object);
1335
} else if (object instanceof char[]) {
1336
return checkSumPlus((char[]) object);
1337
} else if (object instanceof float[]) {
1338
return checkSumPlus((float[]) object);
1339
} else if (object instanceof double[]) {
1340
return checkSumPlus((double[]) object);
1341
} else if (object instanceof Integer[]) {
1342
return checkSumPlus((Integer[]) object);
1343
} else {
1344
failed("Unknow type of array: " + object + " of class " +
1345
object.getClass().getName());
1346
return -1;
1347
}
1348
}
1349
1350
private static int checkSumPlus(int[] a) {
1351
int checkSum = 0;
1352
1353
for (int e : a) {
1354
checkSum += e;
1355
}
1356
return checkSum;
1357
}
1358
1359
private static int checkSumPlus(long[] a) {
1360
long checkSum = 0;
1361
1362
for (long e : a) {
1363
checkSum += e;
1364
}
1365
return (int) checkSum;
1366
}
1367
1368
private static int checkSumPlus(short[] a) {
1369
short checkSum = 0;
1370
1371
for (short e : a) {
1372
checkSum += e;
1373
}
1374
return (int) checkSum;
1375
}
1376
1377
private static int checkSumPlus(byte[] a) {
1378
byte checkSum = 0;
1379
1380
for (byte e : a) {
1381
checkSum += e;
1382
}
1383
return (int) checkSum;
1384
}
1385
1386
private static int checkSumPlus(char[] a) {
1387
char checkSum = 0;
1388
1389
for (char e : a) {
1390
checkSum += e;
1391
}
1392
return (int) checkSum;
1393
}
1394
1395
private static int checkSumPlus(float[] a) {
1396
int checkSum = 0;
1397
1398
for (float e : a) {
1399
checkSum += (int) e;
1400
}
1401
return checkSum;
1402
}
1403
1404
private static int checkSumPlus(double[] a) {
1405
int checkSum = 0;
1406
1407
for (double e : a) {
1408
checkSum += (int) e;
1409
}
1410
return checkSum;
1411
}
1412
1413
private static int checkSumPlus(Integer[] a) {
1414
int checkSum = 0;
1415
1416
for (Integer e : a) {
1417
checkSum += e.intValue();
1418
}
1419
return checkSum;
1420
}
1421
1422
private static void sortByInsertionSort(Object object) {
1423
if (object instanceof int[]) {
1424
sortByInsertionSort((int[]) object);
1425
} else if (object instanceof long[]) {
1426
sortByInsertionSort((long[]) object);
1427
} else if (object instanceof short[]) {
1428
sortByInsertionSort((short[]) object);
1429
} else if (object instanceof byte[]) {
1430
sortByInsertionSort((byte[]) object);
1431
} else if (object instanceof char[]) {
1432
sortByInsertionSort((char[]) object);
1433
} else if (object instanceof float[]) {
1434
sortByInsertionSort((float[]) object);
1435
} else if (object instanceof double[]) {
1436
sortByInsertionSort((double[]) object);
1437
} else if (object instanceof Integer[]) {
1438
sortByInsertionSort((Integer[]) object);
1439
} else {
1440
failed("Unknow type of array: " + object + " of class " +
1441
object.getClass().getName());
1442
}
1443
}
1444
1445
private static void sortByInsertionSort(int[] a) {
1446
for (int j, i = 1; i < a.length; i++) {
1447
int ai = a[i];
1448
for (j = i - 1; j >= 0 && ai < a[j]; j--) {
1449
a[j + 1] = a[j];
1450
}
1451
a[j + 1] = ai;
1452
}
1453
}
1454
1455
private static void sortByInsertionSort(long[] a) {
1456
for (int j, i = 1; i < a.length; i++) {
1457
long ai = a[i];
1458
for (j = i - 1; j >= 0 && ai < a[j]; j--) {
1459
a[j + 1] = a[j];
1460
}
1461
a[j + 1] = ai;
1462
}
1463
}
1464
1465
private static void sortByInsertionSort(short[] a) {
1466
for (int j, i = 1; i < a.length; i++) {
1467
short ai = a[i];
1468
for (j = i - 1; j >= 0 && ai < a[j]; j--) {
1469
a[j + 1] = a[j];
1470
}
1471
a[j + 1] = ai;
1472
}
1473
}
1474
1475
private static void sortByInsertionSort(byte[] a) {
1476
for (int j, i = 1; i < a.length; i++) {
1477
byte ai = a[i];
1478
for (j = i - 1; j >= 0 && ai < a[j]; j--) {
1479
a[j + 1] = a[j];
1480
}
1481
a[j + 1] = ai;
1482
}
1483
}
1484
1485
private static void sortByInsertionSort(char[] a) {
1486
for (int j, i = 1; i < a.length; i++) {
1487
char ai = a[i];
1488
for (j = i - 1; j >= 0 && ai < a[j]; j--) {
1489
a[j + 1] = a[j];
1490
}
1491
a[j + 1] = ai;
1492
}
1493
}
1494
1495
private static void sortByInsertionSort(float[] a) {
1496
for (int j, i = 1; i < a.length; i++) {
1497
float ai = a[i];
1498
for (j = i - 1; j >= 0 && ai < a[j]; j--) {
1499
a[j + 1] = a[j];
1500
}
1501
a[j + 1] = ai;
1502
}
1503
}
1504
1505
private static void sortByInsertionSort(double[] a) {
1506
for (int j, i = 1; i < a.length; i++) {
1507
double ai = a[i];
1508
for (j = i - 1; j >= 0 && ai < a[j]; j--) {
1509
a[j + 1] = a[j];
1510
}
1511
a[j + 1] = ai;
1512
}
1513
}
1514
1515
private static void sortByInsertionSort(Integer[] a) {
1516
for (int j, i = 1; i < a.length; i++) {
1517
Integer ai = a[i];
1518
for (j = i - 1; j >= 0 && ai < a[j]; j--) {
1519
a[j + 1] = a[j];
1520
}
1521
a[j + 1] = ai;
1522
}
1523
}
1524
1525
private static void sort(Object object) {
1526
if (object instanceof int[]) {
1527
Arrays.parallelSort((int[]) object);
1528
} else if (object instanceof long[]) {
1529
Arrays.parallelSort((long[]) object);
1530
} else if (object instanceof short[]) {
1531
Arrays.parallelSort((short[]) object);
1532
} else if (object instanceof byte[]) {
1533
Arrays.parallelSort((byte[]) object);
1534
} else if (object instanceof char[]) {
1535
Arrays.parallelSort((char[]) object);
1536
} else if (object instanceof float[]) {
1537
Arrays.parallelSort((float[]) object);
1538
} else if (object instanceof double[]) {
1539
Arrays.parallelSort((double[]) object);
1540
} else if (object instanceof Integer[]) {
1541
Arrays.parallelSort((Integer[]) object);
1542
} else {
1543
failed("Unknow type of array: " + object + " of class " +
1544
object.getClass().getName());
1545
}
1546
}
1547
1548
private static void sortSubArray(Object object, int fromIndex, int toIndex) {
1549
if (object instanceof int[]) {
1550
Arrays.parallelSort((int[]) object, fromIndex, toIndex);
1551
} else if (object instanceof long[]) {
1552
Arrays.parallelSort((long[]) object, fromIndex, toIndex);
1553
} else if (object instanceof short[]) {
1554
Arrays.parallelSort((short[]) object, fromIndex, toIndex);
1555
} else if (object instanceof byte[]) {
1556
Arrays.parallelSort((byte[]) object, fromIndex, toIndex);
1557
} else if (object instanceof char[]) {
1558
Arrays.parallelSort((char[]) object, fromIndex, toIndex);
1559
} else if (object instanceof float[]) {
1560
Arrays.parallelSort((float[]) object, fromIndex, toIndex);
1561
} else if (object instanceof double[]) {
1562
Arrays.parallelSort((double[]) object, fromIndex, toIndex);
1563
} else if (object instanceof Integer[]) {
1564
Arrays.parallelSort((Integer[]) object, fromIndex, toIndex);
1565
} else {
1566
failed("Unknow type of array: " + object + " of class " +
1567
object.getClass().getName());
1568
}
1569
}
1570
1571
private static void checkSubArray(Object object, int fromIndex, int toIndex, int m) {
1572
if (object instanceof int[]) {
1573
checkSubArray((int[]) object, fromIndex, toIndex, m);
1574
} else if (object instanceof long[]) {
1575
checkSubArray((long[]) object, fromIndex, toIndex, m);
1576
} else if (object instanceof short[]) {
1577
checkSubArray((short[]) object, fromIndex, toIndex, m);
1578
} else if (object instanceof byte[]) {
1579
checkSubArray((byte[]) object, fromIndex, toIndex, m);
1580
} else if (object instanceof char[]) {
1581
checkSubArray((char[]) object, fromIndex, toIndex, m);
1582
} else if (object instanceof float[]) {
1583
checkSubArray((float[]) object, fromIndex, toIndex, m);
1584
} else if (object instanceof double[]) {
1585
checkSubArray((double[]) object, fromIndex, toIndex, m);
1586
} else if (object instanceof Integer[]) {
1587
checkSubArray((Integer[]) object, fromIndex, toIndex, m);
1588
} else {
1589
failed("Unknow type of array: " + object + " of class " +
1590
object.getClass().getName());
1591
}
1592
}
1593
1594
private static void checkSubArray(Integer[] a, int fromIndex, int toIndex, int m) {
1595
for (int i = 0; i < fromIndex; i++) {
1596
if (a[i].intValue() != 0xDEDA) {
1597
failed("Range sort changes left element on position " + i +
1598
": " + a[i] + ", must be " + 0xDEDA);
1599
}
1600
}
1601
1602
for (int i = fromIndex; i < toIndex - 1; i++) {
1603
if (a[i].intValue() > a[i + 1].intValue()) {
1604
failedSort(i, "" + a[i], "" + a[i + 1]);
1605
}
1606
}
1607
1608
for (int i = toIndex; i < a.length; i++) {
1609
if (a[i].intValue() != 0xBABA) {
1610
failed("Range sort changes right element on position " + i +
1611
": " + a[i] + ", must be " + 0xBABA);
1612
}
1613
}
1614
}
1615
1616
private static void checkSubArray(int[] a, int fromIndex, int toIndex, int m) {
1617
for (int i = 0; i < fromIndex; i++) {
1618
if (a[i] != 0xDEDA) {
1619
failed("Range sort changes left element on position " + i +
1620
": " + a[i] + ", must be " + 0xDEDA);
1621
}
1622
}
1623
1624
for (int i = fromIndex; i < toIndex - 1; i++) {
1625
if (a[i] > a[i + 1]) {
1626
failedSort(i, "" + a[i], "" + a[i + 1]);
1627
}
1628
}
1629
1630
for (int i = toIndex; i < a.length; i++) {
1631
if (a[i] != 0xBABA) {
1632
failed("Range sort changes right element on position " + i +
1633
": " + a[i] + ", must be " + 0xBABA);
1634
}
1635
}
1636
}
1637
1638
private static void checkSubArray(byte[] a, int fromIndex, int toIndex, int m) {
1639
for (int i = 0; i < fromIndex; i++) {
1640
if (a[i] != (byte) 0xDEDA) {
1641
failed("Range sort changes left element on position " + i +
1642
": " + a[i] + ", must be " + 0xDEDA);
1643
}
1644
}
1645
1646
for (int i = fromIndex; i < toIndex - 1; i++) {
1647
if (a[i] > a[i + 1]) {
1648
failedSort(i, "" + a[i], "" + a[i + 1]);
1649
}
1650
}
1651
1652
for (int i = toIndex; i < a.length; i++) {
1653
if (a[i] != (byte) 0xBABA) {
1654
failed("Range sort changes right element on position " + i +
1655
": " + a[i] + ", must be " + 0xBABA);
1656
}
1657
}
1658
}
1659
1660
private static void checkSubArray(long[] a, int fromIndex, int toIndex, int m) {
1661
for (int i = 0; i < fromIndex; i++) {
1662
if (a[i] != (long) 0xDEDA) {
1663
failed("Range sort changes left element on position " + i +
1664
": " + a[i] + ", must be " + 0xDEDA);
1665
}
1666
}
1667
1668
for (int i = fromIndex; i < toIndex - 1; i++) {
1669
if (a[i] > a[i + 1]) {
1670
failedSort(i, "" + a[i], "" + a[i + 1]);
1671
}
1672
}
1673
1674
for (int i = toIndex; i < a.length; i++) {
1675
if (a[i] != (long) 0xBABA) {
1676
failed("Range sort changes right element on position " + i +
1677
": " + a[i] + ", must be " + 0xBABA);
1678
}
1679
}
1680
}
1681
1682
private static void checkSubArray(char[] a, int fromIndex, int toIndex, int m) {
1683
for (int i = 0; i < fromIndex; i++) {
1684
if (a[i] != (char) 0xDEDA) {
1685
failed("Range sort changes left element on position " + i +
1686
": " + a[i] + ", must be " + 0xDEDA);
1687
}
1688
}
1689
1690
for (int i = fromIndex; i < toIndex - 1; i++) {
1691
if (a[i] > a[i + 1]) {
1692
failedSort(i, "" + a[i], "" + a[i + 1]);
1693
}
1694
}
1695
1696
for (int i = toIndex; i < a.length; i++) {
1697
if (a[i] != (char) 0xBABA) {
1698
failed("Range sort changes right element on position " + i +
1699
": " + a[i] + ", must be " + 0xBABA);
1700
}
1701
}
1702
}
1703
1704
private static void checkSubArray(short[] a, int fromIndex, int toIndex, int m) {
1705
for (int i = 0; i < fromIndex; i++) {
1706
if (a[i] != (short) 0xDEDA) {
1707
failed("Range sort changes left element on position " + i +
1708
": " + a[i] + ", must be " + 0xDEDA);
1709
}
1710
}
1711
1712
for (int i = fromIndex; i < toIndex - 1; i++) {
1713
if (a[i] > a[i + 1]) {
1714
failedSort(i, "" + a[i], "" + a[i + 1]);
1715
}
1716
}
1717
1718
for (int i = toIndex; i < a.length; i++) {
1719
if (a[i] != (short) 0xBABA) {
1720
failed("Range sort changes right element on position " + i +
1721
": " + a[i] + ", must be " + 0xBABA);
1722
}
1723
}
1724
}
1725
1726
private static void checkSubArray(float[] a, int fromIndex, int toIndex, int m) {
1727
for (int i = 0; i < fromIndex; i++) {
1728
if (a[i] != (float) 0xDEDA) {
1729
failed("Range sort changes left element on position " + i +
1730
": " + a[i] + ", must be " + 0xDEDA);
1731
}
1732
}
1733
1734
for (int i = fromIndex; i < toIndex - 1; i++) {
1735
if (a[i] > a[i + 1]) {
1736
failedSort(i, "" + a[i], "" + a[i + 1]);
1737
}
1738
}
1739
1740
for (int i = toIndex; i < a.length; i++) {
1741
if (a[i] != (float) 0xBABA) {
1742
failed("Range sort changes right element on position " + i +
1743
": " + a[i] + ", must be " + 0xBABA);
1744
}
1745
}
1746
}
1747
1748
private static void checkSubArray(double[] a, int fromIndex, int toIndex, int m) {
1749
for (int i = 0; i < fromIndex; i++) {
1750
if (a[i] != (double) 0xDEDA) {
1751
failed("Range sort changes left element on position " + i +
1752
": " + a[i] + ", must be " + 0xDEDA);
1753
}
1754
}
1755
1756
for (int i = fromIndex; i < toIndex - 1; i++) {
1757
if (a[i] > a[i + 1]) {
1758
failedSort(i, "" + a[i], "" + a[i + 1]);
1759
}
1760
}
1761
1762
for (int i = toIndex; i < a.length; i++) {
1763
if (a[i] != (double) 0xBABA) {
1764
failed("Range sort changes right element on position " + i +
1765
": " + a[i] + ", must be " + 0xBABA);
1766
}
1767
}
1768
}
1769
1770
private static void checkRange(Object object, int m) {
1771
if (object instanceof int[]) {
1772
checkRange((int[]) object, m);
1773
} else if (object instanceof long[]) {
1774
checkRange((long[]) object, m);
1775
} else if (object instanceof short[]) {
1776
checkRange((short[]) object, m);
1777
} else if (object instanceof byte[]) {
1778
checkRange((byte[]) object, m);
1779
} else if (object instanceof char[]) {
1780
checkRange((char[]) object, m);
1781
} else if (object instanceof float[]) {
1782
checkRange((float[]) object, m);
1783
} else if (object instanceof double[]) {
1784
checkRange((double[]) object, m);
1785
} else if (object instanceof Integer[]) {
1786
checkRange((Integer[]) object, m);
1787
} else {
1788
failed("Unknow type of array: " + object + " of class " +
1789
object.getClass().getName());
1790
}
1791
}
1792
1793
private static void checkRange(Integer[] a, int m) {
1794
try {
1795
Arrays.parallelSort(a, m + 1, m);
1796
1797
failed("ParallelSort does not throw IllegalArgumentException " +
1798
" as expected: fromIndex = " + (m + 1) +
1799
" toIndex = " + m);
1800
}
1801
catch (IllegalArgumentException iae) {
1802
try {
1803
Arrays.parallelSort(a, -m, a.length);
1804
1805
failed("ParallelSort does not throw ArrayIndexOutOfBoundsException " +
1806
" as expected: fromIndex = " + (-m));
1807
}
1808
catch (ArrayIndexOutOfBoundsException aoe) {
1809
try {
1810
Arrays.parallelSort(a, 0, a.length + m);
1811
1812
failed("ParallelSort does not throw ArrayIndexOutOfBoundsException " +
1813
" as expected: toIndex = " + (a.length + m));
1814
}
1815
catch (ArrayIndexOutOfBoundsException aie) {
1816
return;
1817
}
1818
}
1819
}
1820
}
1821
1822
private static void checkRange(int[] a, int m) {
1823
try {
1824
Arrays.parallelSort(a, m + 1, m);
1825
1826
failed("ParallelSort does not throw IllegalArgumentException " +
1827
" as expected: fromIndex = " + (m + 1) +
1828
" toIndex = " + m);
1829
}
1830
catch (IllegalArgumentException iae) {
1831
try {
1832
Arrays.parallelSort(a, -m, a.length);
1833
1834
failed("ParallelSort does not throw ArrayIndexOutOfBoundsException " +
1835
" as expected: fromIndex = " + (-m));
1836
}
1837
catch (ArrayIndexOutOfBoundsException aoe) {
1838
try {
1839
Arrays.parallelSort(a, 0, a.length + m);
1840
1841
failed("ParallelSort does not throw ArrayIndexOutOfBoundsException " +
1842
" as expected: toIndex = " + (a.length + m));
1843
}
1844
catch (ArrayIndexOutOfBoundsException aie) {
1845
return;
1846
}
1847
}
1848
}
1849
}
1850
1851
private static void checkRange(long[] a, int m) {
1852
try {
1853
Arrays.parallelSort(a, m + 1, m);
1854
1855
failed("ParallelSort does not throw IllegalArgumentException " +
1856
" as expected: fromIndex = " + (m + 1) +
1857
" toIndex = " + m);
1858
}
1859
catch (IllegalArgumentException iae) {
1860
try {
1861
Arrays.parallelSort(a, -m, a.length);
1862
1863
failed("ParallelSort does not throw ArrayIndexOutOfBoundsException " +
1864
" as expected: fromIndex = " + (-m));
1865
}
1866
catch (ArrayIndexOutOfBoundsException aoe) {
1867
try {
1868
Arrays.parallelSort(a, 0, a.length + m);
1869
1870
failed("ParallelSort does not throw ArrayIndexOutOfBoundsException " +
1871
" as expected: toIndex = " + (a.length + m));
1872
}
1873
catch (ArrayIndexOutOfBoundsException aie) {
1874
return;
1875
}
1876
}
1877
}
1878
}
1879
1880
private static void checkRange(byte[] a, int m) {
1881
try {
1882
Arrays.parallelSort(a, m + 1, m);
1883
1884
failed("ParallelSort does not throw IllegalArgumentException " +
1885
" as expected: fromIndex = " + (m + 1) +
1886
" toIndex = " + m);
1887
}
1888
catch (IllegalArgumentException iae) {
1889
try {
1890
Arrays.parallelSort(a, -m, a.length);
1891
1892
failed("ParallelSort does not throw ArrayIndexOutOfBoundsException " +
1893
" as expected: fromIndex = " + (-m));
1894
}
1895
catch (ArrayIndexOutOfBoundsException aoe) {
1896
try {
1897
Arrays.parallelSort(a, 0, a.length + m);
1898
1899
failed("ParallelSort does not throw ArrayIndexOutOfBoundsException " +
1900
" as expected: toIndex = " + (a.length + m));
1901
}
1902
catch (ArrayIndexOutOfBoundsException aie) {
1903
return;
1904
}
1905
}
1906
}
1907
}
1908
1909
private static void checkRange(short[] a, int m) {
1910
try {
1911
Arrays.parallelSort(a, m + 1, m);
1912
1913
failed("ParallelSort does not throw IllegalArgumentException " +
1914
" as expected: fromIndex = " + (m + 1) +
1915
" toIndex = " + m);
1916
}
1917
catch (IllegalArgumentException iae) {
1918
try {
1919
Arrays.parallelSort(a, -m, a.length);
1920
1921
failed("ParallelSort does not throw ArrayIndexOutOfBoundsException " +
1922
" as expected: fromIndex = " + (-m));
1923
}
1924
catch (ArrayIndexOutOfBoundsException aoe) {
1925
try {
1926
Arrays.parallelSort(a, 0, a.length + m);
1927
1928
failed("ParallelSort does not throw ArrayIndexOutOfBoundsException " +
1929
" as expected: toIndex = " + (a.length + m));
1930
}
1931
catch (ArrayIndexOutOfBoundsException aie) {
1932
return;
1933
}
1934
}
1935
}
1936
}
1937
1938
private static void checkRange(char[] a, int m) {
1939
try {
1940
Arrays.parallelSort(a, m + 1, m);
1941
1942
failed("ParallelSort does not throw IllegalArgumentException " +
1943
" as expected: fromIndex = " + (m + 1) +
1944
" toIndex = " + m);
1945
}
1946
catch (IllegalArgumentException iae) {
1947
try {
1948
Arrays.parallelSort(a, -m, a.length);
1949
1950
failed("ParallelSort does not throw ArrayIndexOutOfBoundsException " +
1951
" as expected: fromIndex = " + (-m));
1952
}
1953
catch (ArrayIndexOutOfBoundsException aoe) {
1954
try {
1955
Arrays.parallelSort(a, 0, a.length + m);
1956
1957
failed("ParallelSort does not throw ArrayIndexOutOfBoundsException " +
1958
" as expected: toIndex = " + (a.length + m));
1959
}
1960
catch (ArrayIndexOutOfBoundsException aie) {
1961
return;
1962
}
1963
}
1964
}
1965
}
1966
1967
private static void checkRange(float[] a, int m) {
1968
try {
1969
Arrays.parallelSort(a, m + 1, m);
1970
1971
failed("ParallelSort does not throw IllegalArgumentException " +
1972
" as expected: fromIndex = " + (m + 1) +
1973
" toIndex = " + m);
1974
}
1975
catch (IllegalArgumentException iae) {
1976
try {
1977
Arrays.parallelSort(a, -m, a.length);
1978
1979
failed("ParallelSort does not throw ArrayIndexOutOfBoundsException " +
1980
" as expected: fromIndex = " + (-m));
1981
}
1982
catch (ArrayIndexOutOfBoundsException aoe) {
1983
try {
1984
Arrays.parallelSort(a, 0, a.length + m);
1985
1986
failed("ParallelSort does not throw ArrayIndexOutOfBoundsException " +
1987
" as expected: toIndex = " + (a.length + m));
1988
}
1989
catch (ArrayIndexOutOfBoundsException aie) {
1990
return;
1991
}
1992
}
1993
}
1994
}
1995
1996
private static void checkRange(double[] a, int m) {
1997
try {
1998
Arrays.parallelSort(a, m + 1, m);
1999
2000
failed("ParallelSort does not throw IllegalArgumentException " +
2001
" as expected: fromIndex = " + (m + 1) +
2002
" toIndex = " + m);
2003
}
2004
catch (IllegalArgumentException iae) {
2005
try {
2006
Arrays.parallelSort(a, -m, a.length);
2007
2008
failed("ParallelSort does not throw ArrayIndexOutOfBoundsException " +
2009
" as expected: fromIndex = " + (-m));
2010
}
2011
catch (ArrayIndexOutOfBoundsException aoe) {
2012
try {
2013
Arrays.parallelSort(a, 0, a.length + m);
2014
2015
failed("ParallelSort does not throw ArrayIndexOutOfBoundsException " +
2016
" as expected: toIndex = " + (a.length + m));
2017
}
2018
catch (ArrayIndexOutOfBoundsException aie) {
2019
return;
2020
}
2021
}
2022
}
2023
}
2024
2025
private static void outArray(Object[] a) {
2026
for (int i = 0; i < a.length; i++) {
2027
out.print(a[i] + " ");
2028
}
2029
out.println();
2030
}
2031
2032
private static void outArray(int[] a) {
2033
for (int i = 0; i < a.length; i++) {
2034
out.print(a[i] + " ");
2035
}
2036
out.println();
2037
}
2038
2039
private static void outArray(float[] a) {
2040
for (int i = 0; i < a.length; i++) {
2041
out.print(a[i] + " ");
2042
}
2043
out.println();
2044
}
2045
2046
private static void outArray(double[] a) {
2047
for (int i = 0; i < a.length; i++) {
2048
out.print(a[i] + " ");
2049
}
2050
out.println();
2051
}
2052
2053
private static class MyRandom extends Random {
2054
MyRandom(long seed) {
2055
super(seed);
2056
mySeed = seed;
2057
}
2058
2059
long getSeed() {
2060
return mySeed;
2061
}
2062
2063
private long mySeed;
2064
}
2065
2066
private static String ourDescription;
2067
}
2068
2069