数据结构上机实验之顺序查找
Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description
在一个的序列里,查找元素是否存在,若存在输出YES,不存在输出NO.
Input
本题多组数据,首先输入一个数字n,然后输入n(n<=1000)个数,然后再输入一个查找数字。
Output
若存在输出YES,不存在输出NO.
Sample Input
4 1 3 5 8 3
Sample Output
YES
Hint
注:
题目没有说所给数据是不是有一定的顺序,用二分法查找的时候一定要注意
二分法做:
#include<stdio.h>
int a[100001];
int ersearch(int a[] ,int l , int r , int k)
{
int i = l , j = r ;
int mid = (l + r) / 2;
while(i <= j)
{
if (a[mid] == k)
{
return 1;
}
else if (a[mid] > k)
{
j = mid - 1;
}
else
{
i = mid + 1;
}
mid = (i + j) / 2;
}
return -1;
}
void pai(int a[] , int n)
{
int i , j ,t;
for (i = 0 ; i < n ; i++)
{
for (j = 0 ; j < n - i -1 ; j++)
{
if (a[j] > a[j+1])
{
t = a[j] , a[j] = a[j+1] , a[j+1] = t;
}
}
}
}
int main()
{
int n , i ;
while(~scanf("%d" , &n))
{
for (i = 0 ; i < n ; i++)
scanf("%d" , &a[i]);
int k;
scanf("%d" , &k);
pai(a , n);
k = ersearch(a , 0 , n - 1 , k);
if (k == 1)
{
printf("YES\n");
}
else if (k == -1)
{
printf("NO\n");
}
}
return 0;
}
普通的做法:
#include<stdio.h>
int a[100001];
int search(int a[], int n , int k)
{
int i ;
for (i = 0 ; i < n ; i++)
{
if (a[i] == k)
{
return 1;
}
}
return -1;
}
int main()
{
int n, i ;
while(~scanf("%d", &n))
{
for (i = 0 ; i < n ; i++)
scanf("%d", &a[i]);
int k;
scanf("%d", &k);
k = search(a, n - 1, k);
if (k == 1)
{
printf("YES\n");
}
else if (k == -1)
{
printf("NO\n");
}
}
return 0;
}