c语言完成分块查找

时间:2021-12-22 20:39:49
  • 首先要把一系列数组均匀分成若干块(最后一个可以不均匀)

    每块中元素任意排列,即块中数字无序,但是整个块之间要有序。因此也存在局限性。


 #include<stdio.h>

 //分块查找法
void black(int b[],int iLong,int key);//分块算法
int max(int a[],int start,int end);//寻求数组中的最大值,并返回。 int main()
{
int iLength,istars,i,iTimes,iNumber,n;
int a[];
printf("please enter the length of the array:\n ");
scanf("%d",&iLength);
printf("please enter the number:\n");
for(i=;i<iLength;i++)
{
scanf("%d",&a[i]);
}
printf("please enter the number that you want:\n");
scanf("%d",&istars); }
int max(int a[],int start,int end)//寻求数组中的最大值,并返回。
{
int i,iTemp;
for(i=start;i<end;i++)
{
if(a[i]>a[i+])
{
iTemp=a[i];
a[i]=a[i+];
a[i+]=iTemp;
}
}
return a[end];
} void black(int b[],int iLong,int key)
{
int a,b,c;
a=; }

自己首先写了如上的代码,但是这种写法发现在写分块查找模块时,越写越难找,越来越难找。所以,这种思路过于复杂。

又由于分块查找法需要分块处理,则需要结构体来实现分块查找,

但是,分块查找法要求每个块之间有序,这就很大的局限性,前一个块的最大值必须比后一个块的最小值小。因此暂定输入整个数组皆为有序。

 #include <stdio.h>

 struct number//结构体,定义每个分块中的数据结构,且每个分块的数据结构能相同
{
int start;
int end;
int key;
}number_table[];//结构体中这个分号一定要有。 int block(int key,int a[])
{
int i,j;
i=;
while( key>number_table[i].key && i<)//确定为哪个分的块中
i++;
if(i>)
return ;
j=number_table[i].start; //设置j为每个块中的首数据。
while(key!=j && j<number_table[i].end)//在块中的什么位置。此时不能具体化为4.因为分块法最后一组不一定为4个
{
j++;
}
if(j>number_table[i].end)
j=;
return j;
}
int main()
{
int i,j,k;
int iStars; int a[];
j=;
printf("please enter fifth numbers.\n");
for(i=;i<=;i++)
{
scanf("%d",&a[i]);
}
//这个循环刚开始没写。
for(i=;i<=;i++)//i的上限表示分组情况,但有个疑问为什么上限为2的时候依旧正确呢
{
number_table[i].start=j+;//第一次循环 开始的下标为1 2循环,开始的下标为6
j++;
number_table[i].end=j+;//第一次循环 结尾的下标为5
j=j+;
number_table[i].key=a[j];//限定了最大值为最后一位 为a[5].
}
printf("please enter the number that you want:\n");
scanf("%d",&iStars); j=block(iStars,a);
if(j==)
printf("Failed\n");
else
printf("success. the number on %d\n",j);
}

但是有个疑问,为什么在for循环中i的上限可以不限定。后来经过研究发现,如果i是2的话,则运用分块查找法数列前排的可以找到,则数据后面的就发现不了,因此,i的分组情况决定了在查找时的范围。