public static int tertiarySearch(int e, int[] a, boolean log) { if ((e < a[0]) || (e > a[a.length-1])) { return -1; } int[] ret = { 0, (a.length-1)/3, (a.length-1)*2/3, a.length-1 }; boolean startLog = true; while (true) { if (log == true) { for (int x : a) { if (a[ret[0]] == x) { startLog = true; } if (a[ret[3]] == x) { System.out.print(x + ":"); startLog = false; } if (startLog == true) { System.out.print(x + " "); } else { System.out.print(" "); } if ((a[ret[1]] == x) || (a[ret[2]] == x)) { System.out.print(":"); } } System.out.println(); } if (e == a[ret[0]]) { return ret[0]; } if (e == a[ret[1]]) { return ret[1]; } if (e == a[ret[2]]) { return ret[2]; } if (e == a[ret[3]]) { return ret[3]; } if (e < a[ret[1]]) { splitThree(ret[0],ret[1]-1,ret); } else { if (e < a[ret[2]]) { splitThree(ret[1],ret[2]-1,ret); } else { splitThree(ret[2],ret[3]-1,ret); } } if (ret[0] == ret[3]) { return -1; } } } private static void splitThree(int start, int end,int[] ret) { ret[0] = start; ret[1] = start+((end-start)/3); ret[2] = start+((end-start)*2/3); ret[3] = end; }