二分法优化

简介:

1,基本的二分思想:

int BinarySearch(int a[],int size,int key)
{
   int L = 0; //查找区间的左端点
   int R = size - 1; //查找区间的右端点
   while( L <= R) { //如果查找区间不为空就继续查找
   int mid = L+(R-L)/2; //取查找区间正中元素的下标
   if( key == a[mid] )
       return mid;
   else if( key > a[mid])
       L = mid + 1; //设置新的查找区间的左端点
   else
       R = mid - 1; //设置新的查找区间的右端点
   }
   return -1;
}

其实:L+(R-L)/2=(R+L)/2

为了防止(L+R)溢出,才这样写(出于ACM的需要)


2,将L  R的初始化边界扩展1

int internalFor(int a[], int l, int r, int key) {//二分法查找a[] l到r区间的某个值
	int L = l - 1;
	int R = r + 1;
	int mid;
	while (R - L > 1) {//不能设置等于
		mid = L + (R - L) / 2;
		if (a[mid] > key) {
			R = mid;
		}
		if (a[mid] < key) {
			L = mid;
		}
		if (a[mid] == key) {
			return mid;
		}
	}
	return -1;
}

3,二分算法用于不等式范围查找:

int bs_nomorethan(int a[], int l, int r, int key) {//寻找小于等于key的元素的个数
	int L = l - 1;
	int R = r + 1;
	int mid;
	while (R - L > 1) {
		mid = L + (R - L) / 2;
		if (a[mid] <= key) {
			L = mid;
		}
		if (a[mid] > key) {
			R = mid;
		}
	}
	return L;
}

4,基于二分法思想的左右线性移动查找:

void ArrayTwoNumberAdd(int a[], int size,int sum) {//使用两边移动桶的方式,进行对数组的两个数之和进行判断
	int L = 0;
	int R = size - 1;
	int num = 0;
	while (L <= R) {
		if (a[L] + a[R] > sum) {
			R--;
		}
		if (a[L] + a[R] < sum) {
			L++;
		}
		if (a[L] + a[R] == sum) {
			cout << a[L] << "+" << a[R] << "=" << sum << endl;
			L++;
			R--;
			num++;
		}
	}
	cout << "总共有个:" << num << "对" << endl;
}


相关文章
|
搜索推荐 算法
插入,选择,堆,快速排序算法思想与复杂度
1.从第一个元素开始,将其视为已排序部分 2.取出下一个元素,在已排序部分从后向前进行比较,找到合适的位置并插入 3.重复上述步骤,直到所有元素都被插入到已排序部分。
78 1
|
7月前
|
算法
数据结构和算法学习记录——时间复杂度的计算(嵌套循环、大O的渐进表示法、双重循环、常数循环、strchr、冒泡排序、二分查找、斐波那契数列递归)
数据结构和算法学习记录——时间复杂度的计算(嵌套循环、大O的渐进表示法、双重循环、常数循环、strchr、冒泡排序、二分查找、斐波那契数列递归)
515 1
|
8月前
|
存储
计数排序及优化
计数排序及优化
76 1
|
8月前
|
搜索推荐
【hoare优化版】快速排序算法 | 三数取中&小区间优化(2)
【hoare优化版】快速排序算法 | 三数取中&小区间优化(2)
92 0
|
8月前
|
算法 C++
动态规划的时间复杂度优化
动态规划的时间复杂度优化
|
算法 搜索推荐
分治法实现合并排序(归并排序),理解分治算法思想,实现分治算法的完美例子合并排序(含码源与解析)
分治法实现合并排序(归并排序),理解分治算法思想,实现分治算法的完美例子合并排序(含码源与解析)
213 0
|
存储 搜索推荐 算法
希尔排序:优化插入排序的精妙算法
排序算法在计算机科学中扮演着重要的角色,其中希尔排序(Shell Sort)是一种经典的排序算法。本文将带您深入了解希尔排序,包括其工作原理、性能分析以及如何使用 Java 进行实现。
290 2
希尔排序:优化插入排序的精妙算法
|
搜索推荐 算法 C语言
手撕排序算法3:优化版冒泡排序和快速排序的三种方法(包括三数取中,小区间优化,递归版本)(上)
手撕排序算法3:优化版冒泡排序和快速排序的三种方法(包括三数取中,小区间优化,递归版本)(上)
手撕排序算法3:优化版冒泡排序和快速排序的三种方法(包括三数取中,小区间优化,递归版本)(上)
|
Java
简单计算时间复杂度
简单计算时间复杂度
41 1
|
搜索推荐 算法
手撕排序算法3:优化版冒泡排序和快速排序的三种方法(包括三数取中,小区间优化,递归版本)(下)
手撕排序算法3:优化版冒泡排序和快速排序的三种方法(包括三数取中,小区间优化,递归版本)(下)

热门文章

最新文章