折半法查找数组中指定数字的位置并返回

昨天出去面试遇到的一个笔试题, 按照自己的思路做了一下, 结果竟然没有写对, 今天总结了下, 重新测试了一下,总结如下!

//
//  ViewController.m
//  折半算法
//
//  Created by Wangjunling on 16/4/12.
//  Copyright © 2016年 Wangjunling. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()
@property (nonatomic, strong) NSArray *arr;

@end

@implementation ViewController

//加载一个包含0-99的有序数组
- (NSArray *)arr {
    if (_arr == nil) {
        NSMutableArray *arrayM = [NSMutableArray array];
        for (int i = 0; i < 100; ++i) {
            [arrayM addObject:@(i)];
        }
        _arr = arrayM.copy;
    }
    return _arr;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    for (int i = 0; i < self.arr.count; i++) {
        NSInteger index  =  [self indexSearch:i fromArr:self.arr];
        NSLog(@"%d  位置%ld", i, (long)index);
    }
    
    
    
}
- (NSInteger)indexSearch:(NSInteger)n fromArr:(NSArray *)arr {
    //开始位置
    NSInteger low = 0;
    //结束位置
    NSInteger high = arr.count;
    //中间位置
    NSInteger mid = 0;
    //记录搜索次数
    int searchCount = 0;
    
    while(low <= high) {
        
        mid=(high+low)/2;
        
        searchCount++;
        
        if (n == [arr[mid] intValue]) {
            break;
        }
        else if (n < [arr[mid] intValue]) {
            high=mid-1;
        } else {
            low=mid+1;
        }
    }
    
    
    NSLog(@"搜索了%d",searchCount);
    return mid;
}
 

@end


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值