{
int[] arr = new int[]{1, 2, 3, 4, 5};
int idx = findMaxIndex(arr, 0, arr.length - 1);
assert (4 == idx);
arr = new int[]{2, 3, 4, 5, 1};
idx = findMaxIndex(arr, 0, arr.length - 1);
assert (3 == idx);
arr = new int[]{3, 4, 5, 1, 2};
idx = findMaxIndex(arr, 0, arr.length - 1);
assert (2 == idx);
arr = new int[]{4, 5, 1, 2, 3};
idx = findMaxIndex(arr, 0, arr.length - 1);
assert (1 == idx);
arr = new int[]{5, 1, 2, 3, 4};
idx = findMaxIndex(arr, 0, arr.length - 1);
assert (0 == idx);
}
public static int findMaxIndex(int[] arr, int start, int end) {
if (end <= start) {
return start;
}
int mid = (start + end) / 2;
if (start <= (mid - 1) && arr[mid - 1] > arr[mid]) {
return mid - 1;
}
if ((mid + 1) <= end && arr[mid] > arr[mid + 1]) {
return mid;
}
if (arr[start] <= arr[mid]) {
return findMaxIndex(arr, mid + 1, end);
}
return findMaxIndex(arr, start, mid - 1);
}