int min_search(int *arr, int low, int high, int key) { if (high < low) return 0; int middle = (high + low) / 2; if (arr[middle] < arr[middle-1]) return middle; if (arr[middle] >= key) { return min_search(arr, middle+1, high, key); } else { return min_search(arr, low, middle-1, key); } }
void main() { list h, c, c_pre; _memcad("add_inductive(h, list)"); _memcad("assume(h != 0)"); min = c_pre = h; min_pre = null; c = h->next; min_search(c, c_pre); }
void min_search(list c, list c_pre ) { if (c == null) return; else if (c->data < min->data){ min = c; min_pre = c_pre; } min_search (c->next, c); }
int main() { int i, ret; for (i = 0; i < MAX_SIZE; i++) arr[i] = rand() % MAX_SIZE; qsort(arr, MAX_SIZE, sizeof(int), compare); for (i = 0; i < MAX_SIZE; i++) { /* Circular shift by 1 element for each iteration */ int temp = arr[0]; memmove(arr, &arr[1], (MAX_SIZE-1) * sizeof(int)); arr[MAX_SIZE-1] = temp; ret = min_search(arr, 0, MAX_SIZE-1, arr[0]); printf("found at %d\n", ret); } return 0; }