(1)定义 left和right;left初值0,right初值n-1(n是查找表中数据的个数);
(2)求中间值mid=(left+right)/2,a[mid];
(3)a[mid]与所求值key比;若a[mid]值小于key;因数组为升序所以mid左部元素均小于key;接下来只需在mid右边查找;所以设置left=mid+1 ;若a[mid]值大于key;因数组为升序所以mid右部元素均打于key;接下来只需在mid左边查找;所以设置right=mid-1 ;
(4)重复(2),(3)步骤,如果a[mid]值等于所求值,则查找成功;如果left>right 则表示没有该元素,则查找失败;
算法可优化改进的提示: 若待查找值key小于a[0]且大于a[n-1],则说明key值不可能的数组中,不需要进入二分查找的步骤
#include <iostream>
using namespace std;
int binarySearch(int arr[], int n, int target, int& compareCount) {
int left = 0;
int right = n - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
compareCount++;
if (arr[mid] == target) {
return mid;
} else if (arr[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
int main() {
int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int n = sizeof(arr) / sizeof(arr[0]);
int target = 6;
int compareCount = 0;
int index = binarySearch(arr, n, target, compareCount);
if (index != -1) {
cout << "Element found at index " << index << endl;
} else {
cout << "Element not found" << endl;
}
cout << "Number of comparisons: " << compareCount << endl;
return 0;
}
#include <iostream>
using namespace std;
#include <stdio.h>
int find_pos(int data[], int n, int key)
{//在数组data中查找给定数据key,n是数组中数据元素的个数,返回值是数据元素比较的次数.
/*------------begin-----------------*/
int mid, left = 0,right = n - 1, times = 0;
if (data[left] > key) return 0;
if (data[right] < key) return 0;
while (left <= right)
{
times++;
mid = (left + right) / 2;
if (data[mid] == key)
{
break;
}
else if (data[mid] > key)
{
right = mid - 1;
}
else
{
left = mid + 1;
}
}
return times;
/*------------end-----------------*/
}
int main(void)
{
int a[] = { -1,15,66,99,122,189 };
int x;
cin >> x;
//此处填写代码,调用find_pos,在a数组中查找给定数据x的位置,并输出函数返回值
/*------------begin-----------------*/
int size = sizeof(a) / sizeof(a[0]);
cout << find_pos(a, size, x);
/*------------end-----------------*/
return 1;
}