力扣-704-二分查找

直达链接

猛然发现我做过了,3月4号

回顾前段时间面试的经历,感觉二分查找的出现概率挺大
当然,也大概是因为都是些小公司,考察的还是很基础的算法
写一篇总结一下

二分查找

条件

  1. 必须是有序序列

因为是每次与“中间值”相比较,这个“中间值”既是序列位置的中间值,也是数值大小的中间值

  1. 存储在数组中

实现

排序可以参考快速排序

// 递归实现
//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;
}
posted @ 2022-08-03 10:27  YaosGHC  阅读(21)  评论(0)    收藏  举报