我找不到解决此问题的正确算法。给出了一个几乎排序的数组,例如5 12 15 17 20 2 4
(请注意,数组按升序排列直到一个点,然后以下数字小于数组的第一个),我需要说一下元素{{ 1}}是否存在于该数组中。最简单的方法是按升序对整个数组进行排序,但必须更快地完成。
我尝试将x
元素与第一个数字和数组的中间x
进行比较,然后如果(1+n)/2
大于第一个数字并且小于我使用二进制搜索的中间数字从1到中间。这个作品。但是我的问题是,x
是否出现在数组的另一半(从中间到n)中,我无法弄清楚。
x
但是我不知道另一半该怎么做,因为第二半中的中间值可能小于左数和右数。
#include <iostream>
int main() {
int n, i, v[50001], k, x;
int left, mid, right;
std::cin >> n;
for (i = 1; i <= n; i++)
std::cin >> v[i];
std::cin >> k;
while (k) {
std::cin >> x;
k--;
left = 1;
right = n;
mid = (left + right) / 2;
// this part of the code works when the number is between v[1] and v[mid]
if(v[mid] == x)
std::cout << x << " is found\n";
if (v[left] <= x && v[mid] >= x) {
right = mid;
while (left < right) {
mid = (left + right) / 2;
if (v[mid] < x)
left = mid + 1;
else
right = mid;
}
if (v[right] == x)
std::cout << x << " is found\n";
else
std::cout << x << " is not found\n";
}