#include <iostream>
using namespace std;
int search(int *a, int target, int n)
{
int left = 0, right = n - 1;
while (left <= right)
{
int mid = left + (right - left) / 2;
if (a[mid] == target)
{
return mid;
}
if (a[left] <= a[mid])
{ // 左半部分有序
if (a[left] <= target && target < a[mid])
{
right = mid - 1; // 目标在左半部分,更新右边界
}
else
{
left = mid + 1; // 目标在右半部分,更新左边界
}
}
else
{ // 右半部分有序
if (a[mid] < target && target <= a[right])
{
left = mid + 1; // 目标在右半部分,更新左边界
}
else
{
right = mid - 1; // 目标在左半部分,更新右边界
}
}
}
return -1; // 没找到目标值
}
int main()
{
int t, n;
cin >> t;
while (t--)
{
cin >> n;
int *a = new int[n];
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
int target;
cin >> target;
cout << search(a, target, n) << endl;
delete[] a;
}
return 0;
}
DS二分查找搜索旋转排序数组
最新推荐文章于 2024-10-04 00:00:03 发布