力扣-704-二分查找
直达链接
猛然发现我做过了,3月4号
回顾前段时间面试的经历,感觉二分查找的出现概率挺大
当然,也大概是因为都是些小公司,考察的还是很基础的算法
写一篇总结一下
二分查找
条件
- 必须是有序序列
因为是每次与“中间值”相比较,这个“中间值”既是序列位置的中间值,也是数值大小的中间值
- 存储在数组中
实现
排序可以参考快速排序
// 递归实现
//int binarySearch(int sortedArray[],int target, int lowIndex, int highIndex) {
//
// if (lowIndex > highIndex) return -1;
//
// int middle = (highIndex - lowIndex) / 2 + lowIndex;
//
// cout << "当前比较的中数下标是:" <<sortedArray[middle] << endl;
//
// if (sortedArray[middle] == target) {
// return middle;
// }
// else if(sortedArray[middle]>target) {
// binarySearch(sortedArray, target, lowIndex, middle - 1);
// }
// else if (sortedArray[middle] < target) {
// binarySearch(sortedArray, target, middle + 1, highIndex);
// }
//}
// 非递归实现
int binarySearch(int sortedArray[],int target,int length) {
if (sortedArray == nullptr || length <= 0) return -1;
int low = 0;
int high = length - 1;
while (low <= high) {
int middle = (high - low) / 2 + low;
if (sortedArray[middle] == target)
return middle;
else if (sortedArray[middle] > target)
high = middle - 1;
else
low = middle + 1;
}
return -1;
}
int main() {
// int data[] = { 2,9,1,14,39,24,19,5,43 };
int data[30];
int start = 1;
iota(begin(data), end(data), start);
int length = sizeof(data)/sizeof(int);
QuickSort(data, length, 0, length - 1);
printf("原数组:\n");
for (int i : data) {
cout << i << " ";
}
printf("\n");
cout<<"二分查找指定元素的下标为:"<<binarySearch(data,4,0,length-1);
return 0;
}