package org.osgl.util.algo;
import org.osgl.$;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Random;
/**
* Created with IntelliJ IDEA.
* User: luog
* Date: 12/11/13
* Time: 11:09 PM
* To change this template use File | Settings | File Templates.
*/
public class ArrayInsertionSortInplace<T> extends ArraySortInplaceBase<T> implements ArraySort<T> {
protected T[] sort0(T[] ts, int from, int to, Comparator<T> comp) {
int size = from + 1;
for (int i = from + 1; i < to; ++i) {
T t = ts[i];
int loc = Arrays.binarySearch(ts, from, size, t, comp);
if (loc < 0) {
loc = ~loc;
}
System.arraycopy(ts, loc, ts, loc + 1, (size - loc));
ts[loc] = t;
size++;
}
return ts;
}
public static void test() {
Integer[] ia = {5, 4, 3, 1, 3, 2, 1, 2};
ArrayInsertionSortInplace<Integer> s = new ArrayInsertionSortInplace<Integer>();
Integer[] a = s.apply(ia, 1, 7, $.F.NATURAL_ORDER);
System.out.println(Arrays.toString(a));
}
private static ArrayInsertionSortInplace<Integer> s = new ArrayInsertionSortInplace<Integer>();
private static ArraySimpleInsertionSortInplace<Integer> x = new ArraySimpleInsertionSortInplace<Integer>();
private static ArrayMergeSortInplace<Integer> m = new ArrayMergeSortInplace<Integer>();
private static long osgl(Integer[] a) {
long l = System.nanoTime();
//s.sort(a, 0, a.length, _.F.NATURAL_ORDER);
//x.sort(a, 0, a.length, _.F.NATURAL_ORDER);
m.sort(a, 0, a.length, $.F.NATURAL_ORDER);
return System.nanoTime() - l;
}
private static long jdk(Integer[] a) {
long l = System.nanoTime();
Arrays.sort(a, $.F.NATURAL_ORDER);
//m.sort(a, 0, a.length, _.F.NATURAL_ORDER);
//s.sort(a, 0, a.length, _.F.NATURAL_ORDER);
return System.nanoTime() - l;
}
public static void benchmark() {
final int ARRAY_LEN = 5000;
final int FACT = ARRAY_LEN == 0 ? 1 : ARRAY_LEN;
final int TIMES = 12800000 / FACT;
$.Var< Long > osgl = $.var(0L);
$.Var<Long> jdk = $.var(0L);
for (int i = 0; i < TIMES; ++i) {
Random r = new Random();
Integer[] a = new Integer[ARRAY_LEN];
for (int j = 0; j < ARRAY_LEN; ++j) {
a[j] = r.nextInt(Integer.MAX_VALUE);
}
Integer[] a1 = (Integer[])a.clone();
Integer[] a2 = (Integer[])a.clone();
long o = osgl(a1);
long j = jdk(a2);
if (!Arrays.equals(a1, a2)) {
System.err.print("Error:");
System.out.println(Arrays.toString(a1));
System.out.println(Arrays.toString(a2));
break;
}
if (i > TIMES / 2) {
osgl.set(o + osgl.get());
jdk.set(j + jdk.get());
}
}
System.out.println(String.format("osgl: %s, jdk: %s", osgl.get() / TIMES / FACT, jdk.get() / TIMES / FACT));
}
public static void main(String[] args) {
benchmark();
}
}