分塊查找法要求將列表組織成如下索引順序結構:數組
首先將列表分紅若干個塊(子表)。通常狀況下,塊的長度均勻,最後一塊能夠不滿。spa
每塊中元素任意排列,即塊內無序,但塊與塊之間有序。code
構造一個索引表。其中每一個索引項對應一個塊並記錄每塊的起始位置,和每塊中最大blog
關鍵字(或最小關鍵字)。索引表按關鍵字有序排列。索引
下圖所示爲一個索引順序表。其中包括三個塊,第一個塊的起始地址爲 0,塊內最class
大關鍵字爲 25;第二個塊的起始地址爲 5,塊內最大關鍵字爲 58;第三個塊的起始地址爲方法
10,塊內最大關鍵字爲 88。im
分塊查找的基本過程以下:db
(1)首先,將待查關鍵字 K 與索引表中的關鍵字進行比較,以肯定待查記錄所在的word
塊。具體的可用順序查找法或折半查找法進行。
(2)進一步用順序查找法,在相應塊內查找關鍵字爲 K的元素。
分塊查找是順序查找的一種改進方法。首先須要對數組進行分塊,分塊查找須要創建一個「索引表」。索引表分爲m塊,每塊含有N/m個元素,塊內是無序的,塊間是有序的,例如塊2中最大元素小於塊3中最小元素。
先用二分查找索引表,肯定須要查找的關鍵字在哪一塊,而後再在相應的塊內用順序查找。分塊查找又稱爲索引順序查找。
時間複雜度:O(log(m)+N/m)
1 //分塊查找 2 template<class T>//索引表 3 struct INDEXTable 4 { 5 T key; 6 int link; 7 }; 8 9 template<class T> IndexOrderSearch(INDEXTable<T> *indexTable,T *x, int N, int m, T keyword)// indexTable爲索引表,x爲原數組,N爲數組大小,m爲塊大小 10 { 11 int L = (N+m-1)/m; 12 int i = 0; 13 while(i < L && indexTable[i].key < keyword) 14 i++; 15 if(i == L) 16 return -1; 17 else 18 { 19 int j = indexTable[i].link; 20 for(j; j<indexTable[i].link + m;j++) 21 if(x[j] == keyword) 22 return j; 23 } 24 return -1; 25 }