/*
二分查找(也称折半查找)是很常见的一种在数组中查找数据的算法,作为一名程序员是应该必须会的。它的基础思想:获取数组的中间值,将数组分割成两份,利用中间值跟指定的值进行比较,如果中间值大于指定的值,就在数组的左边进行查找;如果中间值小于指定值,就在数组的右边进行查找。如此循环的执行下去,最终找到符合的值。
二分查找优点:
1.速度快 2.比较次数少 3.性能好
当然了,
缺点也很明显:
1.必须是一个有序的数组(升序或者降序)
2.适用范围:适用不经常变动的数组
*/
Objective-C代码:
NSArray *arr = @[@(3),@(7),@(9),@(14),@(25),@(26),@(37),@(69)];
NSLog(@"二分查找:%lu",[self binarySearch:arr target:37]);
target是目标值,即要找的值。
- (NSInteger)binarySearch:(NSArray *)array target:(NSInteger)target {
if (!array.count) {
return -1;//数组无元素,返回-1;
}
//数组起始元素下标
NSInteger start = 0,end = array.count - 1;//数组最后元素的下标
NSInteger mid = 0;
//就剩两个数的时候 start = end - 1;这个条件跳出
while (start < end - 1) {
//会有一些朋友看到有些人是( start + end ) / 2这样写的,但是这样写有一点不好,就是low+high会出现整数溢出的情况,如果存在溢出,你再除以2也是没有用的,所以不能这么写
mid = start + ((end - start)/2);
//第mid项的内容
NSInteger curNum = [array[mid] integerValue];
if (curNum > target) {
end = mid;
} else {
start = mid;
}
}
if (target == [array[start] integerValue]) {
return start;
}
if (target == [array[end] integerValue]) {
return end;
}
return -1;
}
swift代码:
let arr = [1,5,11,23,45,55,60,76,88,100];
print(self.binarySearch(array: arr, target: 100))
func binarySearch(array:[Int],target:Int) -> Int {
if array.isEmpty {
return -1
}
var start = 0
var end = array.count - 1
var mid = 0;
while start < end - 1 {
mid = start + ((end - start)/2);
if target < array[mid] {
end = mid
} else {
start = mid
}
}
if (target == array[start]) {
return start
}
if (target == array[end]) {
return end
}
return -1
}