随机产生10个0~100的整数存入一维数组,实现分块查找
- 结果截图
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <windows.h>
#define n 10
typedef struct
{
int max;
int addr;
}IDtable;
int b=0;
void Block(int R[])
{
int i,j,k,t;
int s;
s=(n+b-1)/b;
for(i=1;i<=(b-1)*s;i+=s)
{
for(j=i;j<(i+s);j++)
{
k=j;
for(t=i+s;t<=n;t++)
{
if(R[k]>R[t])
k=t;
}
if(k!=j)
{
R[0]=R[k];
R[k]=R[j];
R[j]=R[0];
}
if(R[j+1]<R[j])
j++;
}
}
}
void Create_ID(int R[],IDtable ID[])
{
int s,i,j,k,m;
m=1;
s=(n+b-1)/b;
for(i=1;i<=n;i+=s)
{
k=i;
for(j=i+1;j<(i+s);j++)
{
if(R[j]>R[k])
k=j;
}
ID[m].addr=i;
ID[m].max=R[k];
m++;
}
}
int BlockSearch(int R[],IDtable ID[],int k)
{
int mid;
int low=1;
int high=b;
int low2,high2;
int i,s;
s=(n+b-1)/b;
while(low<=high)
{
mid=(low+high)/2;
if(ID[mid].max<k)
low=mid+1;
else
high=mid-1;
}
if(low<=b)
{
low2=ID[low].addr;
if(low==b)
high2=n;
else
high2=low+s-1;
for(i=low2;low2<=high2;i++)
{
if(R[i]==k)
return i;
}
}
return 0;
}
void main()
{
int R[n+1];
int flag;
int k;
int i;
IDtable INDEX[10];
for(i=1;i<=(n+1);i++)
{
R[i]=rand()%101;
}
printf("请输入分块的块数:\n");
scanf("%d",&b);
Block(R);
Create_ID(R,INDEX);
do
{
system("cls");
for(i=1;i<=10;i++)
{
printf("%5d",R[i]);
}
printf("\n");
printf("请输入要查找的数:\n");
scanf("%d",&k);
flag=BlockSearch(R,INDEX,k);
if(flag==0)
printf("没有这个数!\n");
else
printf("找到%d,在%d位置上\n",k,flag);
getch();
}while(k!=222);
}