查找
1.顺序查找
在一批整型数据2、 3 、1、 7、5、 8、 9、 0、 4、 6中查找某个元素x是否出现
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int x,k;
int array[] = { 2,3,1,7,5,8,9,0,4,6 };
cout << "请输入要查找的数据:";
cin >> x;
for ( k = 0; k < 10; ++k)
if (x == array[k]) break;
if (x == 10) cout << "没有找到" << endl;
else cout << x << "的存储位置为:" << k + 1<< endl;
return 0;
}
运行结果:
2.二分查找
针对已排好序的数据进行查找
在已排好序的一批整型数据0, 1,2, 3,4, 5,6, 7,8,9中,查找某个元素是否出现,并输出其位置
- 二分查找的迭代实现
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int x,low,high,mid;
int array[] = { 0,1,2,3,4,5,6,7,8,9 };
low = 0;
high = 9;
cout << "请输入要查找的数据:";
cin >> x;
while (low <= high)
{
mid = (low + high) / 2;
if (x == array[mid]) break;
else if (x < array[mid]) high = mid-1;
else low = mid+1;
}
if (low <= high) cout << x << "在数列中的位置为:" << mid + 1 << endl;
else cout << "没有找到" << endl;
return 0;
}
运行结果:
- 二分查找的递归实现
#include<iostream>
using namespace std;
//定义函数
int search(int *array, int lh, int rh, int x);
int main() {
int x,result;
int array[10] = { 0,1,2,3,4,5,6,7,8,9 };
cout << "请输入要查找的元素:" <<endl;
cin >> x;
result = search(array, 0, 9, x);
if (result >= 0)
cout << x << "的存储位置为" << search(array, 0, 9, x) + 1 << endl;
else
cout << "没有找到";
return 0;
}
//lh rh 表示查找范围,x表示要查找位置的数值
int search(int *array, int lh, int rh, int x) {
int mid;
if (lh <= rh) {
mid = (lh + rh) / 2;
if (array[mid] == x) return mid;
else if (array[mid] > x) return search(array, lh, mid - 1, x);//在左半边寻找
else return search(array, mid + 1, rh, x);
}
else return -1;//没有找到
}
运行结果如下:
注: 二分查找算法要比顺序查找算法更为有效。在二分查找中,比较的次数取决于所要查找的元素在数组中的位置。对于n个元素的数组,最差的情况为:查找到区间只剩下一个元素或者根本不存在
当搜索区间变为只剩下一个元素时:
n
/
2
/
2
/
.
.
.
/
2
/
2
=
1
;
(
k
个
2
)
n/2/2/.../2/2=1;(k个2)
n/2/2/.../2/2=1;(k个2)
则
n
=
2
k
n=2^k
n=2k
即
k
=
l
b
n
k=lb n
k=lbn
(lb表示以2为底的对数)
所以使用二分查找最多只需要比较lbn次就可以了.
比较:
n | lbn |
---|---|
10 | 3 |
100 | 7 |
1000 | 10 |
1000000 | 20 |
1000000000 | 30 |
对于小的数组,两个数值差别不大,两种算法都能很好的完成任务,但是当数据较大时,二分查找法便能节约大量时间。