1. 程式人生 > >折半查詢法的遞迴和非遞迴形式

折半查詢法的遞迴和非遞迴形式

/*
1、折半查詢的查詢過程是:先確定待查記錄所在區間,然後逐步縮小範圍至到找到或者找不到該記錄為止。

2、折半查詢的效能分析可以由判定樹得出,折半查詢在查詢成功時給定值進行比較的關鍵字個數至多為⌊log_2 ⌋

*/

//折半查詢法的非遞迴形式

int Search_Bin ( SSTable ST, KeyType kval ) {
   low = 1;  high = ST.length;     // 置區間初值
   while (low <= high) {
      mid = (low + high) / 2;
      if   ( kval == ST.elem[mid].key  )
              return  mid;       // 找到待查元素
      else  if ( kval < ST.elem[mid].key) )
              high = mid - 1;   // 繼續在前半區間進行查詢
      else  low  = mid + 1;  // 繼續在後半區間進行查詢
   }
   return 0;
}


//折半查詢法的遞迴形式
int b_search(int elem[], int low, int high, int kval)
//在陣列elem的下標範圍為low~high(low>0)中查詢kval,若查不到則返回0.
{  
    int mid;  
    if(low>high)  
        return -1;  
    else{  
        mid = (low+high) / 2;  
        if(elem[mid]==kval)  
            return mid;  
        if(kval>elem[mid])  
            return b_search(elem,mid+1,high,kval);        /*在序列的後半部分查詢*/  
        else  
            return b_search(elem,low,mid-1,kval);            /*在序列的前半部分查詢*/  
    }