数组的三种查找方法
非计算机专业的我半路出家,对好多计算机语言基础性的知识都一知半解,今天看天猫的一个关于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); } }
初探佳境,多多学习交流