二分查找

原创 2016年06月01日 14:03:11

一、查找key元素所在的下标

//1、查找key所在位置的下标
int BinarySearch(int arr[], int len,int key)//[left,right]
{
	if (arr == NULL || len <= 0)
		return -1;
	int left = 0;
	int right = len - 1;
	while (left <= right)
	{
		int mid = left +(right-left)/2;
		if (arr[mid] == key)
		{
			return mid;
		}
		else if (arr[mid]<key)
		{
			left = mid + 1;
		}
		else
		{
			right = mid - 1;
		}
	}
	return -1;
}

二、查找key的值第一次出现的下标

1、方法一:

int BinarySearch_First1(int arr[], int len, int key)//[left,right]
{
	if (arr == NULL || len <= 0)
		return -1;
	int left = 0;
	int right = len - 1;
	int res = -1;
	while (left <= right)
	{
		int mid = left + (right - left) / 2;
		if (arr[mid] == key)
		{
			res = mid;
			right = mid - 1;
		}
		else if (arr[mid] < key)
		{
			left = mid + 1;
		}
		else
		{
			right = mid - 1;
		}
	}
	return res;
}

2、方法二:

int BinarySearch_First2(int arr[], int len, int key)//[left,right]
{
	if (arr == NULL || len <= 0)
		return -1;
	int left = 0;
	int right = len - 1;
	while (left <= right)
	{
		int mid = left + (right - left) / 2;
		if (arr[mid] == key)
		{
			if (mid >= 1 && arr[mid - 1] == key)
			{
				right = mid - 1;
			}
			else
			{
				return mid;
			}
		}
		else if (arr[mid] < key)
		{
			left = mid + 1;
		}
		else
		{
			right = mid - 1;
		}
	}
	return -1;
}


三、查找key的值最后一次出现的下标

1、方法一:

int BinarySearch_Last1(int arr[], int len, int key)//[left,right]
{
	if (arr == NULL || len <= 0)
		return -1;
	int left = 0;
	int right = len - 1;
	int res = -1;
	while (left <= right)
	{
		int mid = left + (right - left) / 2;
		if (arr[mid] == key)
		{
			res = mid;
			left = mid + 1;
		}
		else if (arr[mid] < key)
		{
			left = mid + 1;
		}
		else
		{
			right = mid - 1;
		}
	}
	return res;
}

2、方法二:

int BinarySearch_Last2(int arr[], int len, int key)//[left,right]
{
	if (arr == NULL || len <= 0)
		return -1;
	int left = 0;
	int right = len - 1;
	while (left <= right)
	{
		int mid = left + (right - left) / 2;
		if (arr[mid] == key)
		{
			if (mid <= right - 1 && arr[mid + 1] == key)
			{
				left = mid + 1;
			}
			else
			{
				return mid;
			}
		}
		else if (arr[mid] < key)
		{
			left = mid + 1;
		}
		else
		{
			right = mid - 1;
		}
	}
	return -1;
}

四、查找刚好小于key值的最大元素的下标

int BinarySearch_Small(int arr[], int len, int key)//[left,right]
{
	if (arr == NULL || len <= 0)
		return -1;
	int left = 0;
	int right = len - 1;
	while (left <= right)
	{
		int mid = left + (right - left) / 2;
		if (arr[mid] == key)
		{
			right = mid - 1;
		}
		else if (arr[mid] < key)
		{
			if (mid <= right - 1 && arr[mid + 1] < key)
			{
				left = mid + 1;
			}
			else
			{
				return mid;
			}
		}
		else
		{
			right = mid - 1;
		}
	}
	return -1;
}

五、查找刚好小于key值的最小元素的下标

int BinarySearch_Big(int arr[], int len, int key)//[left,right]
{
	if (arr == NULL || len <= 0)
		return -1;
	int left = 0;
	int right = len - 1;
	while (left <= right)
	{
		int mid = left + (right - left) / 2;
		if (arr[mid] == key)
		{
			left = mid - 1;
		}
		else if (arr[mid] < key)
		{
			left = mid + 1;
		}
		else if (arr[mid]>key)
		{
			if (mid >= 1 && arr[mid - 1] > key)
			{
				right = mid - 1;
			}
			else
			{
				return mid;
			}
		}
	}
	return -1;
}

六、总结

1、二分查找一定要关注区间是[ ]还是[ )

2、对应找到key值的最小下标还是最大下标分别有两种方法

但是方法一:适用于几个相等的值不连续的情况(例如;在有序但是含有N ULL的字符串数组中查找字符串)

3、对于找到刚好比key值小还是比key值大的就是在区间上增加一些判断条件即可,也就是上面的第二类题的第第二种解法




版权声明:本文为博主原创文章,未经博主允许不得转载。

【算法-查找之二】二分查找

算法-查找之二二分查找           顺序查找【算法-查找之一】顺序查找是最简单的查找策略,易于分析,适用于小规模数据。如果数据规模很大时,顺序查找的表现就不尽人意,此时需要寻找一...
  • Jiangweihll
  • Jiangweihll
  • 2014年04月15日 10:34
  • 3277

Python实现二分查找算法

二分查找二分查找又叫折半查找,二分查找应该属于减治技术的成功应用。所谓减治法,就是将原问题分解成若干个子问题后,利用了规模为n的原问题的解与较小规模(通常是n/2)的子问题的解之间的关系。 二分查找...
  • SeeTheWorld518
  • SeeTheWorld518
  • 2015年08月21日 23:03
  • 4677

二分查找算法(递归与非递归两种方式)

首先说说二分查找法。 二分查找法是对一组有序的数字中进行查找,传递相应的数据,进行比较查找到与原数据相同的数据,查找到了返回1,失败返回对应的数组下标。 采用非递归方式完成二分查找法。java代码如...
  • lovesummerforever
  • lovesummerforever
  • 2014年04月27日 15:44
  • 84869

快速排序和二分查找

  • 2015年06月10日 17:16
  • 48KB
  • 下载

二分查找算法

  • 2015年02月02日 11:51
  • 334B
  • 下载

二分查找札记

  • 2015年03月19日 13:38
  • 111KB
  • 下载

二分查找算法和冒泡排序算法

  • 2015年04月22日 11:27
  • 942KB
  • 下载

java数组二分查找

  • 2015年11月02日 16:56
  • 2KB
  • 下载

二分查找_测试

  • 2016年12月12日 15:55
  • 149KB
  • 下载

二分查找算法

  • 2014年04月15日 05:21
  • 1KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二分查找
举报原因:
原因补充:

(最多只允许输入30个字)