数据结构顺序表应用6:有序顺序表查询

来源:互联网 发布:老电视接网络电视 编辑:程序博客网 时间:2024/06/06 20:20

顺序表应用6:有序顺序表查询
Time Limit: 7MS Memory Limit: 700KB
Problem Description
顺序表内按照由小到大的次序存放着n个互不相同的整数(1<=n<=20000),任意输入一个整数,判断该整数在顺序表中是否存在。如果在顺序表中存在该整数,输出其在表中的序号;否则输出“No Found!”。
Input
第一行输入整数n,表示顺序表的元素个数;
第二行依次输入n个各不相同的有序整数,代表表里的元素;
第三行输入整数t,代表要查询的次数;
第四行依次输入t个整数,代表每次要查询的数值。
Output
输出t行,代表t次查询的结果,如果找到在本行输出该元素在表中的位置,否则本行输出No Found!
Example Input

10
1 22 33 55 63 70 74 79 80 87
4
55 10 2 87

Example Output

4
No Found!
No Found!
10

Hint
思路:这题运用到一个算法 二分查找 用普通的查找方法会超时。二分查找的思路就是首先你的序列得是有序。题目给了是从小到大,找中间的数和需要查找数比较,如果中间数大于查找数,区间就缩小为左边,反之右边,不断的递归调用函数,直到找到或者找不到(left>right)退出。

#include<stdio.h>#include<stdlib.h>typedef struct node{    int data[20010];    int last;}ST;void creat(ST *head){    int i;    for(i = 0; i < head->last; i++)    scanf("%d", &head->data[i]);}int search(ST *head, int left, int right, int key){    int mid;   if(left <= right)    {        mid = (left + right)/2;        if(key == head -> data[mid])        {            return mid+1;        }        else if(key > head->data[mid])        {            return search(head, mid+1, right, key);        }        else        {            return search(head, left, mid - 1, key);        }    }    return 0;}int main(){    ST *head;    int t, key, k;    head = (ST *)malloc(sizeof(ST));    scanf("%d", &head->last);    creat(head);    scanf("%d", &t);    while(t--)    {        scanf("%d", &key);        k = search(head, 0, head->last, key);        if(k)        printf("%d\n", k);        else        printf("No Found!\n");    }    return 0;}
0 0
原创粉丝点击