package water.util;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import water.TestUtil;
import java.util.Arrays;
import java.util.Random;
public class SortTest extends TestUtil {
@BeforeClass() public static void setup() { stall_till_cloudsize(1); }
@Test public void runSmall() {
int[] idxs = new int[]{0,1,2,3,4};
final double[] values = new double[]{4.2,1.0,-1,4.3,2.0};
ArrayUtils.sort(idxs, values);
Assert.assertTrue(Arrays.equals(idxs, new int[]{2, 1, 4, 0, 3}));
}
@Test public void runMid() {
int[] idxs = new int[]{0,1,2,3,4,5,6,7,8};
final double[] values = new double[]{0.1,-0.3,0.5,9.0,4.2,1.0,-1,4.3,2.0};
ArrayUtils.sort(idxs, values);
Assert.assertTrue(Arrays.equals(idxs, new int[]{6, 1, 0, 2, 5, 8, 4, 7, 3}));
}
@Test public void runHuge() {
for (int N=1<<6;N<1<<17;N<<=1) {
System.err.println("N: " + N);
int[] idxs = new int[N];
int[] idxs2 = new int[N];
long merge = 0;
long insertion = 0;
int reps = 1; //increase for better timing
for (int rep = 0; rep < reps; ++rep) {
final double[] values = new double[idxs.length];
Random rng = new Random();
for (int i = 0; i < idxs.length; ++i) {
idxs[i] = i;
idxs2[i] = i;
values[i] = rng.nextDouble();
}
long before = System.nanoTime();
ArrayUtils.sort(idxs, values);
merge += System.nanoTime() - before;
before = System.nanoTime();
ArrayUtils.sort(idxs2, values, Integer.MAX_VALUE); //always do insertion sort
insertion += System.nanoTime() - before;
}
System.err.println("Merge sort: " + (double)merge/1e9/reps );
System.err.println("Insertion sort: " + (double)insertion/1e9/reps);
Assert.assertTrue(Arrays.equals(idxs, idxs2));
}
}
}