文字描述
分塊查找又稱為索引順序查找,是順序查找的一種改進方法.在此查找算法中,除表本身外, 還需要建立一個”索引表”.索引表中包括兩項內容:關鍵字項(其值為該字表內的最大關鍵字)和指針項(指示該子表的第一個記錄在表中位置)。索引表按關鍵字有序,則表或者有序或者分塊有序。所謂“分塊有序”指的是第二個子表中所有記錄的關鍵字均大於第一個子表中的最大關鍵字,第三個子表中的所有關鍵字均大於第二個子表中的最大關鍵字,,,,以此類推。
因此分塊查找算法需分兩步進行:
先確定待查記錄所在的塊(子表)。由於索引項組成的索引表按關鍵字有序,則確定塊的查找可以用順序查找,也可以用折半查找。
再在塊中順序查找。如果塊中記錄是任意排列的,就只能是順序查找。
示意圖
算法分析
分塊查找的平均查找長度為ASLbs = Lb+Lw, 其中Lb為查找索引表確定所在塊的平均查找長度,Lw為在塊中查找元素的平均查找長度。
一般情況下,為進行分塊查找,可以將長度為n的表均勻地分成b塊,每塊含有s個記錄,即b=[n/s];又假定表中每個記錄的查找概率相等,則每塊查找的概率為1/b,塊中每個記錄的查找概率為1/s。
若用順序查找確定所在塊,順序查找子表中的元素,則分塊查找的平均查找長度為
若用折半查找確定所在塊,順序查找子表中的元素,則分塊查找的平均查找長度為
代碼實現

1 //./a.out 5 13 19 21 37 56 64 75 80 88 92 2 3 #include <stdio.h> 4 #include <stdlib.h> 5 #include <string.h> 6 7 #define DEBUG 8 9 #define MAX_SIZE 50 10 #define BLOCK_SIZE 5 11 12 typedef struct{ 13 int start; 14 int end; 15 int key; 16 }Index_K; 17 18 19 //分塊查找算法 20 int block_search(int key, int a[], Index_K index_k[], int len) 21 { 22 int i = 0; 23 int j = 0; 24 int k = -1; 25 //順序查找確定所在塊 26 while((index_k[i].start>=0) && (key>index_k[i].key)) 27 i+=1; 28 if(index_k[i].start < 0){ 29 return k; 30 } 31 //順序查找子表中的元素 32 for(j = index_k[i].start; j<=index_k[i].end; ++j){ 33 if(key == a[j]) 34 k = j; 35 } 36 return k; 37 } 38 39 //順序打印整型數組中的元素 40 void print(int a[], int len) 41 { 42 int i = 0; 43 for(i=0; i<len; i++){ 44 printf("[%d]:%d ", i, a[i]); 45 } 46 printf("\n"); 47 return; 48 } 49 50 int main(int argc, char *argv[]) 51 { 52 if(argc < 2) 53 return -1; 54 55 int a[MAX_SIZE] = {0}; 56 Index_K index_k[MAX_SIZE/BLOCK_SIZE+1]; 57 58 int i = 0, j = 0, len = 0, key = 0; 59 for(i=1; i<argc; i++){ 60 a[i-1] = atoi(argv[i]); 61 } 62 len = i-1; 63 64 #ifdef DEBUG 65 printf("輸入數據:"); 66 print(a, len); 67 #endif 68 printf("索引表:\n"); 69 i = j = 0; 70 while(i<len){ 71 index_k[j].start = i; 72 index_k[j].end = ((i+BLOCK_SIZE)>(len-1))?(len-1):(i+BLOCK_SIZE); 73 index_k[j].key = ((i+BLOCK_SIZE)>(len-1))?a[len-1]:a[i+BLOCK_SIZE]; 74 printf("index_k[%d].start=%d .end=%d .key=%d\n", j, index_k[j].start, index_k[j].end, index_k[j].key); 75 j += 1; 76 i += BLOCK_SIZE; 77 i += 1; 78 } 79 index_k[j].start = index_k[j].end = index_k[j].key = -1; 80 81 while(1){ 82 printf("輸入key:"); 83 scanf("%d", &key); 84 if(key<0) 85 break; 86 printf("key(%d) 位於 %d\n", key, block_search(key, a, index_k, len)); 87 } 88 return 0; 89 }
運行