分塊查找
索引表 | 22 | 44 | 74 |
數組 | 22 12 13 9 8 | 33 42 44 38 24 | 48 60 58 74 47 |
算法步驟
- 通過索引表線性查找確定在數組的哪一“塊”
- 通過數組裏所在“塊”的線性查找確定是否存在、在哪個位置
算法代碼
Keytype k; // 關鍵字
int blocks; // 整個索引表的長度
int last; // 整個數組的長度 last = blocks * L
index ix LIST F ;
int L ;
Int index_search( k, last, blocks, ix, F,L )
{
int i, j ; // i是索引表座標,j是數組每塊的座標
i = 0; // 第一位索引表
while (( ix[i] < k) && (i < blocks) ) i++ ;
// 當前查找值小於目標值 且 查找的座標在索引表範圍內
if ( i < blocks ) { // i在範圍內則說明上一行代碼有查找到,不在範圍內則沒查找到
j = i*L; // 每塊長度爲L,要在第i塊內查找,數組內的座標j爲i×L
while (( k != F[j].key ) && (j <= (i+1)*L-1 ) && (j < last))
// 當前查找值目標值不同 且 座標j在範圍內 且 j在整個數組範圍內(防止查找最後一“塊”時越界)
j = j + 1; // 查找塊內的下一個查找元素
if ( k == F[ j ].key ) return j ; // 若查找到則返回下標
/* 執行這條語句,有可能是:
1. 上一個while的第一個條件不滿足(即查找成功!)
2. 第二/三個條件不滿足(即越界≈無目標值,查找失敗
*/
}
return –1 ; // 查找失敗
}