非計算機專業的我半路出家,對好多計算機語言基礎性的知識都一知半解,今天看天貓的一個關於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); } }