數組的三種查找方法


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM