- DSA using C Tutorial
- DSA using C - Home
- DSA using C - Overview
- DSA using C - Environment
- DSA using C - Algorithms
- DSA using C - Concepts
- DSA using C - Array
- DSA using C - Linked List
- DSA using C - Doubly Linked List
- DSA using C - Circular Linked List
- DSA using C - Stack
- DSA using C - Parsing Expressions
- DSA using C - Queue
- DSA using C - Priority Queue
- DSA using C - Tree
- DSA using C - Hash Table
- DSA using C - Heap
- DSA using C - Graph
- DSA using C - Search techniques
- DSA using C - Sorting techniques
- DSA using C - Recursion
- DSA using C Useful Resources
- DSA using C - Quick Guide
- DSA using C - Useful Resources
- DSA using C - Discussion
DSA using C - Binary Search
Binary search is a very fast search algorithm. This search algorithm works on the principle of divide and conquer. For this algorithm to work properly the data collection should be in sorted form.
Binary search search a particular item by comparing the middle most item of the collection. If match occurs then index of item is returned. If middle item is greater than item then item is searched in sub-array to the right of the middle item other wise item is search in sub-array to the left of the middle item. This process continues on sub-array as well until the size of subarray reduces to zero.
Binary search halves the searchable items and thus reduces the count of comparisons to be made to very less numbers.
Algorithm
Binary Search ( A: array of item, n: total no. of items ,x: item to be searched) Step 1: Set lowerBound = 1 Step 2: Set upperBound = n Step 3: if upperBound < lowerBound go to step 12 Step 4: set midPoint = ( lowerBound + upperBound ) / 2 Step 5: if A[midPoint] < x Step 6: set lowerBound = midPoint + 1 Step 7: if A[midPoint] > x Step 8: set upperBound = midPoint - 1 Step 9: if A[midPoint] = x go to step 11 Step 10: Go to Step 3 Step 11: Print Element x Found at index midPoint and go to step 13 Step 12: Print element not found Step 13: Exit
Example
#include <stdio.h> #define MAX 20 // array of items on which linear search will be conducted. int intArray[MAX] = {1,2,3,4,6,7,9,11,12,14,15,16,17,19,33,34,43,45,55,66}; void printline(int count){ int i; for(i=0;i <count-1;i++){ printf("="); } printf("=\n"); } int find(int data){ int lowerBound = 0; int upperBound = MAX -1; int midPoint = -1; int comparisons = 0; int index = -1; while(lowerBound <= upperBound){ printf("Comparison %d\n" , (comparisons +1) ); printf("lowerBound : %d, intArray[%d] = %d\n", lowerBound,lowerBound,intArray[lowerBound]); printf("upperBound : %d, intArray[%d] = %d\n", upperBound,upperBound,intArray[upperBound]); comparisons++; // compute the mid point midPoint = (lowerBound + upperBound) / 2; // data found if(intArray[midPoint] == data){ index = midPoint; break; } else { // if data is larger if(intArray[midPoint] < data){ // data is in upper half lowerBound = midPoint + 1; } // data is smaller else{ // data is in lower half upperBound = midPoint -1; } } } printf("Total comparisons made: %d" , comparisons); return index; } void display(){ int i; printf("["); // navigate through all items for(i=0;i<MAX;i++){ printf("%d ",intArray[i]); } printf("]\n"); } main(){ printf("Input Array: "); display(); printline(50); //find location of 1 int location = find(55); // if element was found if(location != -1) printf("\nElement found at location: %d" ,(location+1)); else printf("\nElement not found."); }
Output
If we compile and run the above program then it would produce following output −
Input Array: [1 2 3 4 6 7 9 11 12 14 15 16 17 19 33 34 43 45 55 66 ] ================================================== Comparison 1 lowerBound : 0, intArray[0] = 1 upperBound : 19, intArray[19] = 66 Comparison 2 lowerBound : 10, intArray[10] = 15 upperBound : 19, intArray[19] = 66 Comparison 3 lowerBound : 15, intArray[15] = 34 upperBound : 19, intArray[19] = 66 Comparison 4 lowerBound : 18, intArray[18] = 55 upperBound : 19, intArray[19] = 66 Total comparisons made: 4 Element found at location: 19