顺序表应用6:有序顺序表查询

来源:互联网 发布:淘宝店铺抽奖活动设置 编辑:程序博客网 时间:2024/06/05 15:17

Problem Description

顺序表内按照由小到大的次序存放着n个互不相同的整数,任意输入一个整数,判断该整数在顺序表中是否存在。如果在顺序表中存在该整数,输出其在表中的序号;否则输出“No Found!"。

Input

 第一行输入整数n (1 <= n <= 100000),表示顺序表的元素个数;
第二行依次输入n个各不相同的有序非负整数,代表表里的元素;
第三行输入整数t (1 <= t <= 100000),代表要查询的次数;
第四行依次输入t个非负整数,代表每次要查询的数值。

保证所有输入的数都在 int 范围内。

Output

 输出t行,代表t次查询的结果,如果找到在本行输出该元素在表中的位置,否则本行输出No Found!

Example Input

101 22 33 55 63 70 74 79 80 87455 10 2 87

Example Output

4No Found!No Found!10

不用二分查找会超时

code:
#include<stdio.h>#include<stdlib.h>typedef struct{    int *p;    int length;    int maxsize;}list;void creat(list &L){    L.maxsize = 100010;    L.p = (int *)malloc(L.maxsize*sizeof(int));    L.length = 0;}void input(list &L, int len){    int i;    L.length = len;    for(i = 0;i<len;i++)    {        scanf("%d", &L.p[i]);    }}int find(list &La, int k){    int low = 0, high =La.length-1, mid = 0;    while(low<=high)    {        mid = (low+high)/2;        if(La.p[mid]<k) low = mid+1;        else if(La.p[mid]>k)            high = mid-1;        else return mid+1;    }    return 0;}int main(){    int n, m, i;    list La, Lb;    creat(La);    creat(Lb);    scanf("%d", &n);    input(La, n);    scanf("%d", &m);    input(Lb, m);    for(i = 0;i<m;i++)    {        int flag = find(La, Lb.p[i]);        if(!flag) printf("No Found!\n");        else printf("%d\n", flag);    }}