1.问题
数学语言:给定一个有序数组T,从里面寻找值为n的元素,并输出下标,若元素不存在就输出0。
查找问题。
2.解析
用两种算法写这个问题,最暴力的肯定就是O(n)的遍历算法,遍历整个数组查找是否有值相等的数据;而第二种优秀很多的算法明显就是二分查找啦,精度相同的情况下查找速度提高非常大,时间复杂度仅仅是O(logn)。
3.设计
遍历:
for (i = 1; i <= n; i++) {
if (两元素相等) {
更新位置;
退出循环;
}
}
二分:
int left = 1;
int right = n;
while (左边界小于等于右边界) {
int mid = (right + left) / 2;
if (T[mid] 和待查询元素相等) {
更新位置;
退出循环;
}
else if (T[mid] < 待查询元素)
更新左边界
else if (T[mid] > 待查询元素)
更新右边界
}
4.分析
遍历:O(n)
二分:O(logn)
5.源码
https://github.com/myycjw/search
代码解读及食用方法:
已放在源代码注释内
遍历:
#include<algorithm>
#include<iostream>
#include<stdio.h>
#include<vector>
#include<cmath>
#include<string.h>
using namespace std;
const int maxn = 1e4 + 10;
#define PI 3.14159
#define ll long long
const int inf = 0x3f3f3f3f;
int n, m, q;
int i, j, k;
int T[maxn];
int main() {
cin >> n;//T中元素个数
for (i = 1; i <= n; i++) {
cin >> T[i];
}
sort(T + 1, T + n + 1);//相当于T是排序好的数组
cin >> m;//待查找数
int index = 0;
for (i = 1; i <= n; i++) {
if (T[i] == m) {
index = i;
break;
}
}
cout << index;
}
二分:
#include<algorithm>
#include<iostream>
#include<stdio.h>
#include<vector>
#include<cmath>
#include<string.h>
using namespace std;
const int maxn = 1e4 + 10;
#define PI 3.14159
#define ll long long
const int inf = 0x3f3f3f3f;
int n, m, q;
int i, j, k;
int T[maxn];
int main() {
cin >> n;//T中元素个数
for (i = 1; i <= n; i++) {
cin >> T[i];
}
sort(T + 1, T + n + 1);//相当于T是排序好的数组
cin >> m;//待查找数
int index = 0;
for (i = 1; i <= n; i++) {
if (T[i] == m) {
index = i;
break;
}
}
cout << index;
}