3.4k views

Consider the following C program that attempts to locate an element $x$ in an array $Y[ \ ]$ using binary search. The program is erroneous.

 f (int Y[10] , int x) {
int u, j, k;
i= 0; j = 9;
do {
k = (i+ j) / 2;
if( Y[k] < x) i = k;else j = k;
} while (Y[k] != x) && (i < j)) ;
if(Y[k] == x) printf(" x is in the array ") ;
else printf(" x is not in the array ") ;
}

On which of the following contents of $Y$ and $x$ does the program fail?

1. $Y$ is $[1 \ 2 \ 3 \ 4 \ 5 \ 6 \ 7 \ 8 \ 9 \ 10]$ and $x < 10$
2. $Y$ is $[1 \ 3 \ 5 \ 7 \ 9 \ 11 \ 13 \ 15 \ 17 \ 19]$ and $x < 1$
3. $Y$ is $[2 \ 2 \ 2 \ 2 \ 2 \ 2 \ 2 \ 2 \ 2 \ 2]$ and $x > 2$
4. $Y$ is $[2 \ 4 \ 6 \ 8 \ 10 \ 12 \ 14 \ 16 \ 18 \ 20]$ and $2 < x < 20$ and $x$ is even
edited | 3.4k views
What happens with OPTION B of the second question?

somebody help me analyse?
Assume x=0..ultimately u will come out of the loop when while cdn will fail i. E i<j

Bcz at the last point i n j will be equal to 0th position...

After cmng out of while loop.. Progrm is terminated aftr printing x is not in the array..

Hope it helps..

for Q.84

when it is option C the control will continue to iterate as $i=8$ and $j=9$;
again and again $i$ will be assigned $k$ which itself equals $8$ as $\frac{8+9}{2}$ being stored in an integer type variable, will evaluate to $8$.

For option A, with $x=9$, $k$ will take the following values:

• $4$
• $6$
• $7$
• $8 - y[8] = 9$, $x$ found

For option D, with $x=10$, $k$ will take the following values:

• $4$, $y[4] = 10$, $x$ found

edited by

if (Y[k] < x) i = k + 1; else j = k-1;

and


if (Y[k] < x) i = k - 1; else j = k +1;

But the same index 8 problem will also arise for option (a), when you are searching for say x=9.. Can somebody explain dat plz?
As I solved for option D, with $$x=10$$, the code seems to go in infinite loop. So option D is also incorrect. Please correct me if I am wrong.
for x = 10 in option D, it will find k = (0 + 9)/2 = 4 and Y[4] = 10. the while loop will exit, giving you the answer. There is no infinite loop in that.
 do {
k = (i+ j) / 2;
if( Y[k] < x) i = k;else j = k;
} while (Y[k] != x) && (i < j)) ;

Here i=k and j=k creates the problem.

just do i=k+1 and j=k-1

when we search the elements which is not in array and that element in the range of first and last element  results infinite looping. that is unsuccessful search and range should be inbetween first and last.

another problem when searching last element and greater than of last element.

edited by

Binary search fails if all the elements are same.

How binary search fails when all elements are same?
The errorfull nature of this program is not related with "what type of elements are stored in array" .the error is regarding "what element we want to search..if the element we want to search is more than or equal to last element of array,it will cause problem as program will never terminate ..
If all elements are equal then searching element should be greater than the array element..in just that case it should just exactly greater..
For binary search there are two necessary conditions:

1.Array should be sorted.

2.All the elements in the array should be distinct.

for Ques.84 option c is correct

The second one is not a requirement. It happens here just because code is wrong. See

https://gateoverflow.in/43508/gate2008-85

Explanation: The above program doesn’t work for the cases where element to be searched is the last element of Y[] or greater than the last element (or maximum element) in Y[]. For such cases, program goes in an infinite loop because i is assigned value as k in all iterations, and i never becomes equal to or greater than j. So while condition never becomes false. So ans is option :C
@Arjun sir  why second condition is not necessary for binary search (distinct element) please explain in detail.