您的位置:首页 > 理论基础 > 数据结构算法

数据结构实验之查找四:二分查找

2017-02-21 15:05 232 查看
think:

1时间复杂度logN

2二分查找体现了分而治之的思想

3注意i <= j和mid的每次变化

sdut原题链接

数据结构实验之查找四:二分查找

Time Limit: 30MS Memory Limit: 65536KB

Problem Description

在一个给定的无重复元素的递增序列里,查找与给定关键字相同的元素,若存在则输出找到的位置,不存在输出-1。

Input

一组输入数据,输入数据第一行首先输入两个正整数n ( n < = 10^6 )和m ( m < = 10^4 ),n是数组中数据元素个数,随后连续输入n个正整数,输入的数据保证数列递增。

随后m行输入m个待查找的关键字key

Output

若在给定的序列中能够找到与关键字key相等的元素,则输出位序(序号从0开始),否则输出-1。

Example Input

8 3

4 6 8 9 13 20 21 22

6

8

17

Example Output

1

2

-1

Hint

Author

xam

以下为accepted代码——递归

#include <stdio.h>
int n, m, a[100004];
int search(int low, int high, int key)
{
if(low <= high)
{
int mid = (low + high)/2;
if(a[mid] == key)
{
return mid;
}
if(a[mid] < key)
{
search(mid+1, high, key);
}
else if(a[mid] > key)
{
search(low, mid-1, key);
}
}
else
return -1;
}
int main()
{
int x;
scanf("%d %d", &n, &m);
for(int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
for(int i = 0; i < m; i++)
{
scanf("%d", &x);
printf("%d\n", search(0, n-1, x));
}
return 0;
}

/***************************************************
User name:
Result: Accepted
Take time: 32ms
Take Memory: 496KB
Submit time: 2017-02-21 14:57:06
****************************************************/


以下为accepted代码——递推

#include <stdio.h>
int n, m, a[100004];
void search(int x)
{
int i = 0, j = n-1, mid;
while(i <= j)
{
mid = (i + j)/2;
if(a[mid] == x)
{
printf("%d\n", mid);
return;
}
if(x < a[mid])
{
j = mid-1;
}
else if(x > a[mid])
{
i = mid+1;
}
}
printf("-1\n");
}
int main()
{
int x;
scanf("%d %d", &n, &m);
for(int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
for(int i = 0; i < m; i++)
{
scanf("%d", &x);
search(x);
}
return 0;
}

/***************************************************
User name:
Result: Accepted
Take time: 32ms
Take Memory: 496KB
Submit time: 2017-02-21 14:47:02
****************************************************/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息