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

来源:互联网 发布:淘宝什么值得买 编辑:程序博客网 时间:2024/06/13 21:27

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

Time Limit: 1000MS Memory Limit: 4096KB
SubmitStatistic

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

Hint

Author

解题思路:

查询,就是和关键数字进行比较。但如果遍历寻找会超时,但是顺序表有序,所以可以用二分查找。

#include <iostream>
using namespace std;
typedef int status;
typedef int element;
typedef struct
{
    element *elem;
    int length;
    int listsize;
}list;
status chushi(list &l)
{
   l.elem=new int[1000001];
   if(!l.elem)return -1;
   l.length=0;
   return 0;
}
status creat(list &l,int n)
{
    l.elem=new int[1000010];
        l.length=n;
        if(!l.elem)return -1;
        else
        {
           for(int i=0;i<n;i++)
           {
              cin>>l.elem[i];
           }
        }


    return 0;
}
status find(list &l,int s,int d,int key)
{
    int mid=(s+d)/2;
    if(s==d)
    {
        if(key==l.elem[s])
            {cout<<s+1<<endl;return 0;}
        else
            {cout<<"No Found!"<<endl;return 0;}
    }
    if(l.elem[mid]==key)
        {cout<<mid+1<<endl;return 0;}
    else if(l.elem[mid]>key)
        find(l,s,mid,key);
    else
        find(l,mid+1,d,key);
        return 0;
}
void display(list l)
{
    int i;
    for(i=0;i<l.length;i++)
    {
        if(i==l.length-1)
        cout<<l.elem[i]<<endl;
        else
            cout<<l.elem[i]<<" ";
    }
}
int main()
{
    int n,T,c;
    cin>>n;
    list l;
    creat(l,n);
    cin>>T;
    while(T--)
    {
        cin>>c;
        find(l,0,n-1,c);
    }
    return 0;
}

原创粉丝点击