二分查找算法的原理及一个实用小技巧
来源:互联网 发布:数据库安全测试 编辑:程序博客网 时间:2024/05/17 05:13
二分查找算法是在有序数组中用到的较为频繁的一种算法,在未接触二分查找算法时,最通用的一种做法是,对数组进行遍历,跟每个元素进行比较,其时间复杂度为O(n),但二分查找算法则更优,因为其查找时间复杂度为O(log2 n),比如数组{0,1,2,3,4,5,6,7,8 9},查找元素6,用二分查找的算法执行的话,其顺序为:
1.第一步查找中间元素,即4,由于4<6,则6必然在4之后的数组元素中,那么就在{5,6,7,8,9}中查找,
2.寻找{5,6,7,8,9}的中位数,为7,7>6,则6应该在7左边的数组元素中,那么只剩下{5,6},按此类推就可以找到了。
1.第一步查找中间元素,即4,由于4<6,则6必然在4之后的数组元素中,那么就在{5,6,7,8,9}中查找,
2.寻找{5,6,7,8,9}的中位数,为7,7>6,则6应该在7左边的数组元素中,那么只剩下{5,6},按此类推就可以找到了。
二分查找算法就是不断将数组进行对半分割,每次拿中间元素和goal进行比较。代码如下演示,也可以用递归算法实现,但是考虑到递归算法效率低,一般不建议采用
#include <iostream>int search(int *scr,unsigned int len,int goal);int main(){int num;int tab[10]={0,1,2,3,4,5,6,7,8,9};int location;std::cout<<"Please input the number you want to search:";std::cin>>num;location=search(tab,10,num);if(location!=-1)std::cout<<"The number's location is "<<location+1<<std::endl;elsestd::cout<<"The number don't exist"<<std::endl;return 0;} int search(int *scr,unsigned int len,int goal){unsigned int low = 0;unsigned int high = len-1;while(low<=high){unsigned int mid = low + (high-low);//防止溢出 if(scr[mid]==goal)return mid;else if(scr[mid]<goal)low = mid +1;else high = mid - 1;}return -1;}
这里有个挺不错的小技巧:在这里不用 mid = (low + high)/2,
而是用 mid=low+((high-low)/2),原因是
使用(low+high)/2会有整数溢出的问题。问题会出现在当low+high的结果大于表达式结果类型所能表示的最大值时,这样,产生溢出后再/2不会产生正确结果
0 0
- 二分查找算法的原理及一个实用小技巧
- 二分查找算法和链表相关小技巧
- 非常非常实用的一个小技巧
- 一个简单实用的css小技巧
- 二分查找的原理及代码实现
- 一个经典的二分查找算法
- 一个经典的二分查找算法
- 一个没有bug的二分查找算法
- 一个提高查找速度的小技巧
- 一个提高查找速度的小技巧
- 二分查找的技巧
- 二分查找算法及分析
- 一个经典的二分查找算法的Bug
- 实现二分查找算法的递归及非递归。
- 实现二分查找算法的递归及非递归
- 二分查找的小BUG
- 二分查找的小改进
- 实用的python小技巧
- 104岁的杨绛先生送给年轻人的9句话
- Java基础回顾 : 文件类中的一些常用的方法
- hdu2222,AC自动机,trie图
- 软件工程(二十一)
- [Android]Android通用流行框架大全20160528
- 二分查找算法的原理及一个实用小技巧
- Android Retrofit 2.0自定义Converter(JSONObject Converter)
- struts2第一天基础配置 action package result 全局result redirect chain redirectAction
- 测试测试
- fragment中使用setOnItemClickListener监听无效的解决办法
- LeetCode-241.Different Ways to Add Parentheses
- [Android]Android图片压缩(质量压缩和尺寸压缩)
- java学习总结(16.05.28~16.05.29)使用svn管理源代码
- iOS应用发布流程详解