/*******************
线性查找法————折半查找
通过选择法排序对学号进行排序
折半查找的基本思想:首先选取数组中间位置的元素,
将其与查找键进行比较,如果相等,则返回下标,找出值,否则,查找区间缩小为原来的一半,
**********************/
#include <stdio.h>
#define N 40void DataSort(int score[],long num[],int n);
int BinSearch(long num[],long x,int n);
int ReadScore(int score[],long num[]);
int ReadScore(int score[],long num[]) //录入成绩
{
int i = -1;
do{
i++;
printf("请输入学号:");
scanf("%ld",&num[i]);
printf("请输入成绩:");
scanf("%d",&score[i]);
}while(num[i] > 0 && score[i] >= 0);
return i;
}
void DataSort(int score[],long num[],int n) //对学号大小进行排序
{
int i,j,k,temp1;
long temp2;
for(i = 0; i < n - 1;i++){
k = i;
for(j = i+1;j < n;j++ )
{
if(num[j] < num[k])
{
k = j;
}
}
if(k != i)
{
temp1 = score[k]; score[k] = score[i]; score[i] = temp1;
temp2 = num[k]; num[k] = num[i]; num[i] = temp2;
}
}
}
int BinSearch(long num[],long x,int n) //折半查找函数
{
int low,high,mid;
int pos = -1;
int find = 0; //置找到标志变量flag为假
low = 0;
high = n-1;
while(!find && low <= high)
{
mid = (high + low)/2;
if(x > num[mid])
{
low = mid + 1;
}else if(x < num[mid]){
high = mid - 1;
}else{
pos = mid;
find = 1; //置找到标志变量flag为真
}
}
return pos;
}
int main(){
int score[N],n,pos;
long num[N],x;
n = ReadScore(score,num) ;
DataSort(score,num,n);
printf("学生总数:%d\n",n);
printf("请输入ID:");
scanf("%ld",&x);
pos = BinSearch(num,x,n);
if(pos != -1)
{
printf("查询结果%d\n",score[pos]);
}else{
printf("查无此人");
}
return 0;
}