I wrote these two methods here to find min and max. #2 is based on this answer from this post here.
private static Pair classicMinMax(int[] elements) {
int min = MAX_VALUE;
int max = MIN_VALUE;
for (int i = 0; i < elements.length; i++) {
int e = elements[i];
if (e < min) min = e;
if (e > max) max = e;
}
return new Pair(min, max);
}
private static Pair divideAndConquer(int[] elements) {
int min = MAX_VALUE;
int max = MIN_VALUE;
for (int i = 0; i < elements.length - 1; i += 2) {
int a = elements[i];
int b = elements[i + 1];
if (a > b) {
if (b < min) min = b;
if (a > max) max = a;
} else {
if (a < min) min = a;
if (b > max) max = b;
}
}
if (elements.length % 2 != 0) {
int lastElement = elements[elements.length - 1];
if (lastElement < min) min = lastElement;
if (lastElement > max) max = lastElement;
}
return new Pair(min, max);
}
If I run simple benchmarks like this:
@Test
public void timingsBoth() throws Exception {
int size = 1000;
for (int i = 1000; i < 10_000; i += 1000) {
int arraySize = size * i;
System.out.println("step is " + arraySize);
List<Integer> list = new ArrayList<>(arraySize);
int[] elements = new int[arraySize];
for (int k = 0; k < arraySize; k++) {
list.add(k);
}
Collections.shuffle(list);
Integer[] integers = list.toArray(new Integer[0]);
for (int k = 0; k < arraySize; k++) {
elements[k] = integers[k];
}
long start = currentTimeMillis();
classicMinMax(elements);
long stop = currentTimeMillis();
long result = stop - start;
System.out.println("classic is " + result);
start = currentTimeMillis();
divideAndConquer(elements);
stop = currentTimeMillis();
result = stop - start;
System.out.println("divideAndConquer is " + result);
}
}
}
And I'm usually getting this result:
step is 1000000
classic is 8
divideAndConquer is 11
step is 2000000
classic is 2
divideAndConquer is 5
step is 3000000
classic is 11
divideAndConquer is 17
step is 4000000
classic is 5
divideAndConquer is 10
step is 5000000
classic is 4
divideAndConquer is 16
step is 6000000
classic is 6
divideAndConquer is 14
step is 7000000
classic is 6
divideAndConquer is 18
step is 8000000
classic is 8
divideAndConquer is 20
step is 9000000
classic is 8
divideAndConquer is 24
Did I get the algorithm wrong? I was expecting at least a similar result.