int search(int *a, int n, int x){
int mid, low=0, high=n-1;
while ((a[high]!=a[low])&&(x>=a[low])&&(x<=a[high])){
mid=l+((x-a[low])*(high-low)/(a[high]-a[low]));
if(a[mid]<x){
l=mid+1;
}
else if(x<a[mid]){
h=mid-1;
}
else return mid;
}
if(x==a[low]){
return low;
}
else return -1;
}
Mình không rõ sao cần điều kiện a[high]!=a[low]. Nó đâu cần thiết vì nếu gặp trường hợp hội tụ về cuối high = low nên a[high] = a[low] thì chắc chắn vòng lặp dừng vì x có thể không đáp ứng được điều kiện (x>=a[low]) hay (x<=a[high]), còn nếu đáp ứng để vòng lặp chạy tiếp thì dừng ngay tại " else return mid; " rồi, khi đó low = mid = high.