有序数组中的二分查找
2016-07-08 08:15
302 查看
最近看一些算法题发现这些问题到最后落实到实现上都是编程基础的体现,包括对基本的for,if,else,while等语句的理解程度,还有对循环递归的理解。所以还是得回归最基本的算法,现在去学习那些高深复杂的DP,KMP,红黑树未免有点好高骛远。目前应该坚持基础,打好基础,毕竟不是CS科班出身。言归正传,二分查找就是一个最基础的算法。它的时间复杂度O(logn)。分为迭代实现和递归实现两种,如下:程序没有经过很多测试,应该有bug,欢迎指正。
int BinarySearch(int * a, int beg, int end, int elem) { if(beg <= end) { int mid = (beg + end ) / 2; if(a[mid] == elem) { return mid; } else if(a[mid] > elem) { end = mid-1; } else { beg = mid+1; } return BinarySearch(a, beg, end, elem); } else { return -1; } } int BinarySearchRecursive(int *a, int length, int elem) { if(a == NULL || length <=0) { return -1; } return BinarySearch(a, 0, length-1, elem); } int BinarySearchIterator(int *a, int length, int elem) { if(a == NULL || length <=0) { return -1; } int beg = 0; int end = length-1; int mid = 0; while(beg <= end) { mid = (beg + end) / 2; if(a[mid] == elem) { return mid; } else if(a[mid] > elem) { beg = mid + 1; } else { end = mid - 1; } } return -1; }
这里主要注意二分查找时,两个下标的变化,以及最终结束查找的判断条件是beg>end(查找失败),或者(a[mid]==end)。时间有限,代码质量一般,轻喷。
相关文章推荐
- 关于struts和Spring 结合到一起之后存在ACtion创建单实例还是多
- 用电视,修电视,造电视,造电视元件,定义电视
- 在windows平台下使用Android Studio的lldb插件调试andord程序的ndk代码的必要配置
- JAVA FOR Android 关于JSON字符串的解析
- lvm2做底层创建kvm虚拟机
- 《UML基础只是讲解》
- xml之libxml2使用
- 20条IPTables防火墙规则用法!
- 使用冒泡对数组进行排序
- FatMouse' Trade(贪心)
- 在UIView中添加点击事件oc及swift
- mysql的group_concat 对应 oracle的wm_concat
- js中nodeName nodeType nodeValue的用法和区别
- 浅析遗传算法
- vs2015 配置boost
- 【JZOJ4587】Snow的追寻
- 让您的Xcode键字如飞
- C语言运算符优先级 之 快速记忆
- 多态笔记
- mysql基本知识学习