int arr[N] = {9,10,11,12,13,14,15,16,17,18,19,0,1,2,3,4,5,6,7,8};
void print_header(int target) {
printf("search :%2d %*c | ", target, 5, ' ');
for (int i = 0; i < N; i++) {
for (int i = 0; i< N; i++) {
void print_array(int p, int m, int q, int *a) {
printf("p=%2d, m=%2d, q=%2d |%*c", p, m, q, 4 * p + (p>0?1:0), ' ');
for (int i = p; i <= q; i++) {
int search_loop_array(int x, int* a, int length) {
int increase = (a[m] <= a[mm] && a[mm] <= a[q]);
if ( ( increase && x <= a[q] ) || ! increase)
int increase = a[p] <= a[mm] && a[mm] <= a[m];
if ( increase && x >= a[p] || !increase)
int search_loop_array2(int x, int low, int high, int* a) {
if (low >= high && a[low] != x)
int m = (low + high) / 2;
print_array(low, m, high, a);
int increase = (a[m] <= a[mm] && a[mm] <= a[high]);
if ( !increase || (increase && x <= a[high] ) )
int increase = (a[low] <= a[mm] && a[mm] <= a[m]);
if ( !increase || (increase && x >= a[low] ) )
return search_loop_array2(x, low, high, a);
for (int i = 0; i < N; i++) {
// printf("result: %d\n\n", search_loop_array(i, arr, N));
printf("result: %d\n\n", search_loop_array2(i, 0, N-1, arr));