c语言实现二分搜索算法
来源:互联网 发布:java接口防止重复调用 编辑:程序博客网 时间:2024/06/06 20:45
二分搜索针对有序的数组,每次和中间元素比较,如果相等则直接返回,如果不相等则搜索范围可以减半。二分法可以将复杂度从 Ο(n) 降到 Ο(log n)。 本来以为二分法很简单,半分钟搞定,但写起来尼玛才发现不是这里有点问题,就是那里有问题。
针对整数的二分搜索
直接上代码:
- int binary_search(int data[], int n, int x)
- {
- if(n <= 0 || x < data[0] || x > data[n-1]){
- return -1;
- }
- int left = 0, right = n-1;
- int middle;
- while(left <= right){
- middle = (left + right)/2;
- if(x == data[middle]){
- return middle;
- }else if(x > data[middle]){
- left = middle + 1;
- }else{
- right = middle - 1;
- }
- }
- return -1;
- }
上面假定的 data 是按升序排列。
通用的二分搜索算法
- #include <stdio.h>
- #include <assert.h>
- int binary_search(void *data, int n, int size, void *ele, int(*cmp)(void*, void*))
- {
- if(n <= 0 || (*cmp)(ele, data) < 0 || (*cmp)(data+(n-1)*size, ele) < 0){
- return -1;
- }
- int left = 0, right = n-1;
- int middle;
- while(left <= right){
- middle = (left + right)/2;
- if((*cmp)(ele, data+size*middle) == 0){
- return middle;
- }else if((*cmp)(data+size*middle, ele) < 0){
- left = middle + 1;
- }else{
- right = middle - 1;
- }
- }
- return -1;
- }
- int cmp_int(void *a, void *b){
- return *(int*)a - *(int*)b;
- }
- int main()
- {
- int data[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
- int x = 3;
- int index = binary_search(data, 10, sizeof(int), &x, cmp_int);
- printf("%d\n", index); // 2
- return 0;
- }
通用的版本有些奇葩,多处用到 void*, 这是 c 的常用伎俩。如果使用 c++ 模板的话也会好很多。
标准库算法
c 的 stdlib.h 头文件提供了一个二分搜索函数: void *bsearch(const void *key, const void *base, size_t nmem, size_t size, int (*comp)(const void *, const void *)); 和上面的原型大体一样,只是顺序不同而已。
c++ 的二分搜索:bool binary_search (ForwardIterator first, ForwardIterator last, const T& val);
0 0
- c语言实现二分搜索算法
- 二分搜索||c语言实现
- 算法之二分搜索树C语言实现
- 最快搜索算法之二分搜索,最快排序算法之快排【C语言实现】
- C语言实现二分查找算法
- C语言实现二分查找算法
- 二分查找算法的C语言实现
- c语言实现二分查找算法
- 用C语言实现二分查找算法
- 算法入门---java语言实现的二分搜索树小结
- 二分搜索(BinarySearch)的分治思想C语言实现
- 二分搜索递归与非递归C语言实现
- 二分搜索算法的实现
- 二分算法C实现
- 快速排序和二分查找算法的实现C语言
- c语言实现的通用二分查找算法
- C语言实现折半查找(二分查找)的算法
- c语言二分查找算法
- Asp.mvc(一)~使用MongoDB来存储数据
- C++11中,获取随机数的新方法default_random_engine
- [Android]模拟器不能启动,报错:Cannot set up guest memory 'android_arm': Invalid argument
- 学习笔记---Android Handler机制
- 黑马程序员—IOS基础之OC—ARC和Category
- c语言实现二分搜索算法
- Maven安装,Eclipse创建项目过程
- Improving Your Code With Android Support Annotations(译文)
- 可数集合与不可数集合
- Rotate Image
- λ演算
- JAVA线程中ThreadLocal和volatile的说明
- HDU水题 统计元音
- HDU 1237 简单计算器(栈)