/*******************
线性查找法————折半查找
通过选择法排序对学号进行排序
折半查找的基本思想:首先选取数组中间位置的元素,
将其与查找键进行比较,如果相等,则返回下标,找出值,否则,查找区间缩小为原来的一半,
**********************/

折半查找---通过选择法排序对成绩进行排序

#include <stdio.h>

#define N 40
void 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;
}

相关文章: