二分查找法是从已经排序的线性表(通常是数组)里快速查找到目标元素所在索引,时间复杂度O(log2n)。
以下是从java源代码中抄来,稍微修改的代码。
#include <stdio.h> #include <assert.h> #define ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0])) int binarySearch(const int[], size_t,const int); void rangeCheck(size_t, size_t, size_t); int binarySearch0(const int[], size_t fromIndex, size_t toIndex, const int); int main() { int array[] = {1, 3, 5, 7, 9}; int key = 3; int result = binarySearch(array, ARRAY_SIZE(array),key); if( result == -1) printf("Element %d is not present in array\n",key); else printf("Element %d is present at index %d\n", key,result); return 0; } int binarySearch(const int array[], size_t size,const int key) { return binarySearch0(array,0, size,key); } void rangeCheck(size_t arrayLength , size_t fromIndex, size_t toIndex) { assert(fromIndex > toIndex); assert(fromIndex < 0); assert(toIndex > arrayLength); } //函数指针() int binarySearch0(const int array[], size_t fromIndex, size_t toIndex, const int key) { int low = fromIndex; int high = toIndex - 1; while (low <= high) { int mid = (low + high) >> 1; //算法精妙之处,用位移方法快速决定中值的索引 int midVal = array[mid]; int cmp = midVal - key; if (cmp < 0) low = mid + 1; else if (cmp > 0) high = mid - 1; else return mid; // key found } return -(low + 1); // key not found. return 0; }
运行结果:
Element 3 is present at index 1
本博客文章绝大多数为原创,少量为转载,代码经过测试验证,如果有疑问直接留言或者私信我。
创作文章不容易,转载文章必须注明文章出处;如果这篇文章对您有帮助,点击右侧打赏,支持一下吧。
创作文章不容易,转载文章必须注明文章出处;如果这篇文章对您有帮助,点击右侧打赏,支持一下吧。