binary search - c (simple)
search - basic:
/** @author kuchaguangjie@gmail.com */ #include <stdio.h> /** * binary search (simple) * * @param * arr pointer of array * @param * len length of array * @param * x target to search * * @return index of target in the array,return -1 if not found, */ int bin_search(int *arr,int len,int x) { // indexs int start = 0,end = len-1,middle; while (end >= start) { middle = (start + end) >> 1; if (*(arr+middle)==x) { return middle; } else if(x < *(arr+middle)) { end = middle - 1; } else { start = middle + 1; } } // not found return -1; } int main() { int arr_1[8] = {0,1,3,4,6,7,9,10}; int i_1 = bin_search(arr_1,8,3); int i_2 = bin_search(arr_1,8,9); int i_3 = bin_search(arr_1,8,5); int i_4 = bin_search(arr_1,8,15); int i_5 = bin_search(arr_1,8,-5); printf("expect:\n\t2,6,-1,-1,-1\n"); printf("actural:\n\t%d,%d,%d,%d,%d\n",i_1,i_2,i_3,i_4,i_5); }
search - first / last / all
/** @author kuchaguangjie@gmail.com */ #include <stdio.h> /** * binary search, search the first match, * * @param * arr pointer of array * @param * len length of array * @param * x target to search * * @return index where target first appear in the array,return -1 if not found, */ int bin_search_first(int *arr,int len,int x) { // indexs int start = 0,end = len-1,middle; while (end > start) { // here must be '>', not '>=', otherwise endless loop might happen, middle = (start + end) >> 1; if(*(arr+middle) < x) { start = middle + 1; } else { end = middle; } } if(*(arr+start) == x) { return start; } else { // not found return -1; } } int test_search_first() { int len = 17; int arr_1[17] = {0,1,3,4,6,7,7,7,7,7,7,7,7,7,7,9,10}; int i_0 = bin_search_first(arr_1,len,7); int i_1 = bin_search_first(arr_1,len,3); int i_2 = bin_search_first(arr_1,len,9); int i_3 = bin_search_first(arr_1,len,5); int i_4 = bin_search_first(arr_1,len,15); int i_5 = bin_search_first(arr_1,len,-5); printf("expect:\n\t5,2,15,-1,-1,-1\n"); printf("actural:\n\t%d,%d,%d,%d,%d,%d\n",i_0,i_1,i_2,i_3,i_4,i_5); } /** * binary search, search the last match, * * @param * arr pointer of array * @param * len length of array * @param * x target to search * * @return index where target last appear in the array,return -1 if not found, */ int bin_search_last(int *arr,int len,int x) { // indexs int start = 0,end = len-1,middle; while (end > start) { // here must be '>', not '>=', otherwise endless loop might happen, middle = (start + end + 1) >> 1; // here must be '(start + end + 1)', not '(start + end)', otherwise endless loop might happen, if(*(arr+middle) > x) { end = middle - 1; } else { start = middle; } } if(*(arr+end) == x) { return end; } else { // not found return -1; } } int test_search_last() { int len = 17; int arr_1[17] = {0,1,3,4,6,7,7,7,7,7,7,7,7,7,7,9,10}; int i_0 = bin_search_last(arr_1,len,7); int i_1 = bin_search_last(arr_1,len,3); int i_2 = bin_search_last(arr_1,len,9); int i_3 = bin_search_last(arr_1,len,5); int i_4 = bin_search_last(arr_1,len,15); int i_5 = bin_search_last(arr_1,len,-5); printf("expect:\n\t14,2,15,-1,-1,-1\n"); printf("actural:\n\t%d,%d,%d,%d,%d,%d\n",i_0,i_1,i_2,i_3,i_4,i_5); } /** * result of search all match, * first is the index of first match, -1 means no match * last is the index of last match, -1 means no match * count is the count of match, */ typedef struct {int first, last, count;} all_result; /** * binary search, search all match, * steps: * first search a match, * if not found, then return, over, * if found, divide the array into 2 part by the found match, search in left part for the first match,and search in the right part for the last match, then combine them, that's the result, * * @param * arr pointer of array * @param * len length of array * @param * x target to search * * @return type all_result */ all_result * bin_search_all(int *arr,int len,int x) { // indexs int start = 0,end = len-1,middle; static all_result result; result.first = -1;result.last = -1;result.count = 0; // this is a static variable, init it every time, while (end >= start) { middle = (start + end) >> 1; if (*(arr+middle)==x) { // find a match result.first = bin_search_first(arr+start,middle-start+1,x)+start; result.last = bin_search_last(arr+middle, end-middle+1,x)+middle; result.count = result.last - result.first + 1; return &result; } else if(x < *(arr+middle)) { end = middle - 1; } else { start = middle + 1; } } return &result; } int test_search_all() { int len = 17; int arr_1[17] = {0,1,3,4,6,7,7,7,7,7,7,7,7,7,7,9,10}; all_result *r_0 = bin_search_all(arr_1,len,7); printf("r_0\texpect: [5, 14]:10,\tactrual: [%d, %d]:%d\n",r_0->first,r_0->last,r_0->count); all_result *r_1 = bin_search_all(arr_1,len,3); printf("r_1\texpect: [2, 2]:1,\tactrual: [%d, %d]:%d\n",r_1->first,r_1->last,r_1->count); all_result *r_2 = bin_search_all(arr_1,len,9); printf("r_2\texpect: [15, 15]:1,\tactrual: [%d, %d]:%d\n",r_2->first,r_2->last,r_2->count); all_result *r_3 = bin_search_all(arr_1,len,5); printf("r_3\texpect: [-1, -1]:0,\tactrual: [%d, %d]:%d\n",r_3->first,r_3->last,r_3->count); all_result *r_4 = bin_search_all(arr_1,len,15); printf("r_4\texpect: [-1, -1]:0,\tactrual: [%d, %d]:%d\n",r_4->first,r_4->last,r_4->count); all_result *r_5 = bin_search_all(arr_1,len,-5); printf("r_5\texpect: [-1, -1]:0,\tactrual: [%d, %d]:%d\n",r_5->first,r_5->last,r_5->count); } int main() { test_search_all(); }