用分块查找的方法实现对学生成绩的查找。

来源:百度知道 编辑:UC知道 时间:2024/05/09 11:46:01
(1)将若干学生成绩按分数段存放在数组a的不同位置上。其中低于60分的成绩排在数组的最前面若干位置上,后面依次分段存放60~69分、70~79分、80~89分,90~100分的成绩。要求同一分数段的分数必须存放在一起,但不要求同一分数段内的分数有序。
(2)为处理方便,假设每个分数段内的数据个数为10个.
(3)每个分数段内的分数要随机或者可外部输入产生。
(4)要求用分块查找的方法查找出某个分数在表中的实际位置.
提示:
首先将每个分数段内的最高分组织在另外一个数组中,在该数组中用二分法(对半查找)找到待查数据所在的分数段,然后再到相应的段中去顺序查找。注意此处的二分法和通常二分法实现细节上的差别。

#include <stdio.h>
#include <stdlib.h>
#define N 5
main()
{
int A[N*10],B[N]={59,69,79,89,99},i,j,x,kuai,mark,mid;
for(i=0;i<10;i++)//生成第一块数据10个
A[i]=rand()%60;
for(i=1;i<N;i++)//生成后面4块数据
for(j=0;j<10;j++)
A[i*10+j]=rand()%10+50+i*10;

for(i=0;i<N;i++)//分块打印
{
for(j=0;j<10;j++)
printf("%d ",A[i*10+j]);
putchar('\n');
}
while(scanf("%d",&x)!=EOF){
i=0,j=N-1,mark=false;
if(x<0||x>=100)
{
printf("未找到!\n");
continue;
}
while(i<j)//折半查找块号
{
mid=(i+j)/2;
if(B[mid]>x)
j=mid;
else if(B[mid]<x)
i=mid+1;
else
{
mark=true;
printf("位置:第%d块第9号\n",mid);
break;
}
}
kuai=i;
if(!mark)
{

for(i=kuai*10,j=0;j<10;j++)//块内查找