数组的三种查找方法

 
非计算机专业的我半路出家,对好多计算机语言基础性的知识都一知半解,今天看天猫的一个关于scrollView 子视图复用的Demo时看到了二分法的使用,所以总结学习一下数组的查找方法。弥补不足!

1.简介
 
数组的三种查找方法分别为,顺序查找,二分法查找(折半查找),分块查找
 
顺序查找:不需要排序,遍历所有数组元素,查找时间较长。


二分法查找:需要对所有数据进行排序,适合顺序结构。因为每次都是和中间值比较,如果大于选中间值后面的部分继续二分查找,如果小于中间值则选前面的部分
继续执行
 
分块查找:需要按照数值大小进行排序分块,虽然每个块中的大小可以不排序,但是块的取值区间是排序的。
 

 
2.二分法使用
 
//添加数据并排序
-(void)setupArr{
    for (int index=0; index<30; index++) {
        int i=random()%1000;
        
        [self.dataSource addObject:[NSNumber numberWithInt:i]];
        //NSLog(@"第%d个数是:%d",index,i);
    }
    //这个数据就是我们等会测试查找的数据
    [self.dataSource addObject:[NSNumber numberWithInt:queryNumber]];
    
    self.sortedDataSource=[self.dataSource sortedArrayUsingComparator:^NSComparisonResult(id  obj1, id  obj2) {
        int i1=[obj1 intValue];
        int i2=[obj2 intValue];
        //升序
        if (i1<i2) {
            return NSOrderedAscending;
        }else{
            return NSOrderedDescending;
        }
    }].copy;
    
    for (int index=0; index < self.sortedDataSource.count; index++) {
        NSLog(@"第%d个数是:%d",index,[self.sortedDataSource[index] intValue]);
    }
}

//二分法查询
-(void)query{
    
    int searchCount=0;//记录查询次数
    int index = 0;//520位置index
    BOOL isFounded=NO;//是否找到
    
    int min = 0;
    int max =(int) self.sortedDataSource.count-1;
    int mid = ceilf((min+max)/2.0);
    
    do {
        searchCount++;
        int tmp = [self.sortedDataSource[mid] intValue];
        
        if (tmp==queryNumber) {
            max=mid;//这么设置可以退出循环了
            isFounded=YES;
            index=mid;
            break;
        }
        
        if (tmp<queryNumber) {//520在mid和max之间
            min=mid;
        }
        
        if (tmp>queryNumber) {//520在min和mid之间
            max=mid;
        }
        //取中
        mid = ceilf((min+max)/2.0);
        
    } while (mid>min&&mid<max);


    if (isFounded) {
        NSLog(@"数字%d的位置在:%d,共查找了%d次",queryNumber,index,searchCount);
    }else{
        NSLog(@"没有查找到数字%d,共查找了%d次",queryNumber,searchCount);
    }
    
}

 

posted @ 2017-05-05 15:04  有棱角的圆  阅读(7548)  评论(0编辑  收藏  举报