C語言分塊查找算法,索引順序查找算法
例如,采用分塊查找法在有序表 11、12、18、28、39、56、69、89、96、122、135、146、156、256、298 中查找關(guān)鍵字為 96 的元素。
査找特定關(guān)鍵字元素個數(shù)為 15,要求用戶輸入有序表各元素,程序輸出査找成功與否,若成功,還顯示元素在有序表中的位罝。
實現(xiàn)過程:
(1)定義結(jié)構(gòu)體 index,用于存儲塊的結(jié)構(gòu),并定義該結(jié)構(gòu)體數(shù)組 index_table。
(2)自定義函數(shù) block_search(),實現(xiàn)分塊查找。
(3) main() 函數(shù)作為程序的入口函數(shù)。程序代碼如下:
#include <stdio.h>
struct index //定義塊的結(jié)構(gòu)
{
int key; //塊的關(guān)鍵字
int start; //塊的起始值
int end; //塊的結(jié)束值
}index_table[4]; //定義結(jié)構(gòu)體數(shù)組
int block_search(int key,int a[]) //自定義實現(xiàn)分塊查找
{
int i,j;
i=1;
while(i<=3&&key>index_table[i].key) //確定在哪個塊中
i++;
if(i>3) //大于分得的塊數(shù),則返回0
return 0;
j=index_table[i].start; //j等于塊范圍的起始值
while(j<=index_table[i].end&&a[j]!=key) //在確定的塊內(nèi)進(jìn)行順序查找
j++;
if(j>index_table[i].end) //如果大于塊范圍的結(jié)束值,則說明沒有要査找的數(shù),j置0
j = 0;
return j;
}
int main()
{
int i,j=0,k,key,a[16];
printf("請輸入15個數(shù):\n");
for(i=1;i<16;i++)
scanf("%d",&a[i]); //輸入由小到大的15個數(shù)
for(i=1;i<=3;i++)
{
index_table[i].start=j+1; //確定每個塊范圍的起始值
j=j+1;
index_table[i].end=j+4; //確定每個塊范圍的結(jié)束值
j=j + 4;
index_table[i].key=a[j]; //確定每個塊范圍中元素的最大值
}
printf("請輸入你想査找的元素:\n");
scanf("%d",&key); //輸入要查詢的數(shù)值
k=block_search(key,a); //調(diào)用函數(shù)進(jìn)行杳找
if(k!=0)
printf("查找成功,其位置是:%d\n",k); //如果找到該數(shù),則輸出其位置
else
printf("查找失敗!"); //若未找到,則輸出提示信息
return 0;
}
運(yùn)行結(jié)果:
請輸入15個數(shù):
11 12 18 28 39 56 69 89 96 122 135 146 156 256 298
請輸入你想査找的元素:
96
查找成功,其位置是:9
技術(shù)要點(diǎn):
分塊査找也稱為索引順序査找,要求將待查的元素均勻地分成塊,塊間按大小排序,塊內(nèi)不排序,所以要建立一個塊的最大(或最。╆P(guān)鍵字表,稱為索引表。
本實例中將給出的 15 個數(shù)按關(guān)鍵字大小分成了 3 塊,這 15 個數(shù)的排列是一個有序序列,也可以給出無序序列,但必須滿足分在第一塊中的任意數(shù)都小于第二塊中的所有數(shù),第二塊中的所有數(shù)都小于第三塊中的所有數(shù)。當(dāng)要査找關(guān)鍵字為 key 的元素時,先用順序杳找在已建好的索引表中查出 key 所在的塊中,再在對應(yīng)的塊中順序查找 key,若 key 存在,則輸出其相應(yīng)位置,否則輸出提示信息。
作者:大學(xué)生新聞網(wǎng) 來源:大學(xué)生新聞網(wǎng)
- C語言求n的階乘(n!)
- 從鍵盤輸入一個數(shù),求出這個數(shù)的階乘,即 n!。
- 03-05 關(guān)注:0
- C語言分塊查找算法,索引順序查找算法
- 例如,采用分塊查找法在有序表 11、12、18、28、39、56、69、89、96、122、135、146、156、256、298 中查找關(guān)鍵字為 96 的元素。
- 03-05 關(guān)注:0
- C語言二分查找算法,折半查找算法
- 本實例采用二分查找法查找特定關(guān)鍵字的元素。要求用戶輸入數(shù)組長度,也就是有序表的數(shù)據(jù)長度,并輸入數(shù)組元素和査找的關(guān)鍵字。
- 03-05 關(guān)注:0
- C語言歸并排序算法
- 用歸并排序法對一組數(shù)據(jù)由小到大進(jìn)行排序,數(shù)據(jù)分別為 695、458、362、789、12、 15、163、23、2、986。
- 03-05 關(guān)注:0
- C語言選擇排序算法
- 用選擇排序法對一組數(shù)據(jù)由小到大進(jìn)行排序,數(shù)據(jù)分別為 526、36、2、369、56、45、78、92、125、52。
- 03-05 關(guān)注:0
- C語言快速排序算法
- 用快速排序法對一組數(shù)據(jù)由小到大進(jìn)行排序,數(shù)據(jù)分別為 99、45、12、36、69、22、62、 796、4、696。
- 03-05 關(guān)注:0
- C語言直接插入排序算法
- 插入排序是把一個記錄插入到已排序的有序序列中,使整個序列在插入該記錄后仍然有序。插入排序中較簡單的種方法是直接插入排序
- 03-03 關(guān)注:3
- C語言冒泡排序算法
- 用冒泡排序法對任意輸入的 10 個數(shù)按照從小到大的順序進(jìn)行排序。
- 03-03 關(guān)注:5