Binary Search Illustrated walk through
Dec 13, 2014
Binary SearchIllustrated walk through
int begin = 0;int last = array.Length - 1; int mid = 0;
while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}
return -1;
Part #1 Initialize pointers
Part #2 Search
Iterative binary search
2 4 5 6
[0] [1] [2] [3]
begin last mid4x
This is what we search for
Let’s look for 4
2 4 5 6
[0] [1] [2] [3]
int begin = 0;int last = array.Length - 1; int mid = 0;
begin
last
mid
4x0
0
3
2 4 5 6
[0] [1] [2] [3]
0begin
last
mid
while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}
return -1;
4x0 <= 3is true
0
3
2 4 5 6
[0] [1] [2] [3]
begin
last
mid
while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}
return -1;
4x
(0+3)/2 = 1
0
1
3
2 4 5 6
[0] [1] [2] [3]
begin
last
mid
while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}
return -1;
4x
4 < 4is false
0
1
3
2 4 5 6
[0] [1] [2] [3]
begin
last
mid
while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}
return -1;
4x
4 > 4is false
0
1
3
2 4 5 6
[0] [1] [2] [3]
begin
last
mid
while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}
return -1;
4x0
1
3
We found x=4 at index 1!
2 4 5 6
[0] [1] [2] [3]
begin last mid5x
This is what we search for
Let’s look for 5
2 4 5 6
[0] [1] [2] [3]
int begin = 0;int last = array.Length - 1; int mid = 0;
begin
last
mid
5x0
0
3
2 4 5 6
[0] [1] [2] [3]
0begin
last
mid
while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}
return -1;
5x0 <= 3is true
0
3
2 4 5 6
[0] [1] [2] [3]
begin
last
mid
while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}
return -1;
5x
(0+3)/2 = 1
0
1
3
2 4 5 6
[0] [1] [2] [3]
begin
last
mid
while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}
return -1;
5x
4 < 5is true
0
1
3
2 4 5 6
[0] [1] [2] [3]
begin
last
mid
while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}
return -1;
5x2
1
3
2 4 5 6
[0] [1] [2] [3]
begin
last
mid
while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}
return -1;
5x2
1
32 <= 3is true
2 4 5 6
[0] [1] [2] [3]
begin
last
mid
while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}
return -1;
5x2
2
3
(2+3)/2 =2
2 4 5 6
[0] [1] [2] [3]
begin
last
mid
while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}
return -1;
5x2
2
3
5 < 5is false
2 4 5 6
[0] [1] [2] [3]
begin
last
mid
while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}
return -1;
5x2
2
3
5 > 5is false
2 4 5 6
[0] [1] [2] [3]
while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}
return -1;
5xbegin
last
mid
2
2
3
We found x=5 at index 2!
2 4 5 6
[0] [1] [2] [3]
begin last mid6x
This is what we search for
Let’s look for 6
2 4 5 6
[0] [1] [2] [3]
int begin = 0;int last = array.Length - 1; int mid = 0;
begin
last
mid
6x0
0
3
2 4 5 6
[0] [1] [2] [3]
0begin
last
mid
while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}
return -1;
6x0 <= 3is true
0
3
2 4 5 6
[0] [1] [2] [3]
begin
last
mid
while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}
return -1;
6x
(0+3)/2 = 1
0
1
3
2 4 5 6
[0] [1] [2] [3]
begin
last
mid
while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}
return -1;
6x
4 < 6is true
0
1
3
2 4 5 6
[0] [1] [2] [3]
begin
last
mid
while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}
return -1;
6x2
1
3
2 4 5 6
[0] [1] [2] [3]
begin
last
mid
while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}
return -1;
6x2
1
32 <= 3is true
2 4 5 6
[0] [1] [2] [3]
begin
last
mid
while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}
return -1;
6x2
2
3
(2+3)/2 =2
2 4 5 6
[0] [1] [2] [3]
begin
last
mid
while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}
return -1;
6x2
2
3
5 < 6is true
2 4 5 6
[0] [1] [2] [3]
begin
last
mid
while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}
return -1;
6x3
2
3
2 4 5 6
[0] [1] [2] [3]
begin
last
mid
while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}
return -1;
6x3
2
33 <= 3is true
2 4 5 6
[0] [1] [2] [3]
begin
last
mid
while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}
return -1;
6x3
3
3
(3+3)/2 = 3
2 4 5 6
[0] [1] [2] [3]
begin
last
mid
while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}
return -1;
6x3
3
3
6 < 6is false
2 4 5 6
[0] [1] [2] [3]
begin
last
mid
while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}
return -1;
6x3
3
3
6 > 6is false
2 4 5 6
[0] [1] [2] [3]
while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}
return -1;
6x
We found x=6 at index 3!
begin
last
mid
3
3
3