分块查找

来源:互联网 发布:成都租房 知乎 编辑:程序博客网 时间:2024/05/18 03:38
分块查找是折半查找和顺序查找的一种改进方法,分块查找由于只要求索引表是有序的,对块内节点没有排序要求,因此特别适合于节点动态变化的情况。索引表分为m块,每块含有N/m个元素,块内是无序的,块间是有序的,例如块2中最大元素小于块3中最小元素。先用二分查找索引表,确定需要查找的关键字在哪一块,然后再在相应的块内用顺序查找。
#include<stdio.h>//第一块最大值小于第二块最小值,第二块最大值小于第三块最小值struct index{    int key;    int start;    int end;}index_table[4];int block_search(int key,int a[]){    int i=1,j;    while(i<=3&&key>index_table[i].key)         //确定在哪个快中        i++;    if(i>3)                                     //大于分得的块数,则返回0        return 0;    j=index_table[i].start;                     //j等于块范围的起始值    while(j<=index_table[i].end&&a[j]!=key)     //在确定的块内进行顺序查找        j++;    if(j>index_table[i].end)                    //如果大于块范围的结束值,则说明没有要查找的数,j置0        j=0;    return j;}void main(){    int i,j=0,k,key,a[16];    printf("请按序输入15个数:\n");    for(i=1;i<16;i++)        scanf("%d",&a[i]);    for(i=1;i<=3;i++)    {        index_table[i].start=j+1;               //确定每个块范围的起始值        j=j+1;        index_table[i].end=j+4;                 //确定每个块范围的结束值        j=j+4;        index_table[i].key=a[j];                //确定每个块范围中元素的最大值    }    printf("请输入你想查找的元素:\n");    scanf("%d",&key);    k=block_search(key,a);    if(k!=0)        printf("查找成功!其位置是:%d\n",k);    else        printf("查找失败!");}
原创粉丝点击