二分查找算法-精简 稳定

//*************************************
// 函数名称:FineTab  二分查找算法 ->查温度表
// 函数功能:查找数据在表中相应的位置 表中数据从大到小
// 入口參数:表地址、表长度、要查找的数据
// 出口參数:无
// 返 回 值:数据在表中的位置
//***************************************/

int FineTab(int *a,int TabLong,int data)//查表数据为从大到小排序
{
		int st,ed,m ;
		int i ;

		st = 0 ;//初始化要查询的数为第一个
		ed = TabLong-1 ;//最后一个数
		i = 0  ;

		if(data >= a[st]) return st ;
		else if(data < a[ed]) return ed ;

		while(st < ed)
		{
			m = (st+ed)>>1 ;//二分取要查询的中间值

			if(data == a[m] ) break ;
			if(data < a[m] && data > a[m+1]) break ;

			if(data > a[m])	ed = m ;
			else st = m ;	

			if(++i > TabLong) break ;
		}

		if(st > ed ) return 0 ;
		return m ;
}
//*************************************
// 函数名称:FineTab  二分查找算法 ->查温度表
// 函数功能:查找数据在表中相应的位置 表中数据从小到大排序
// 入口參数:表地址、表长度、要查找的数据
// 出口參数:无
// 返 回 值:数据在表中的位置
//***************************************/

int Fine1Tab(int *a,int TabLong,int data)
{
		int st,ed,m ;
		int i ;

		st = 0 ;//初始化要查询的数为第一个
		ed = TabLong-1 ;//最后一个数
		i = 0  ;

		if(data <= a[st]) return st ;//小于等于第一个数 ,查询值为0。即为第一个数
		else if(data >= a[ed]) return ed ;//大于等于最后一个数。查询之为最后一个数

		while(st < ed)//循环查询
		{
	    	m = (st+ed)>>1 ;//二分取要查询的中间值
			if(data == a[m] ) break ;//刚好是要查询的值。结束查询
			if(data > a[m-1] && data < a[m]) break ;//data介于中间值和中间值的上个值之间,结束查询
			if(data < a[m])	ed = m ;//data小于当前中间值,更新最后的范围值
			else st = m ;	//data大于当前中间值。更新開始的范围值	

			if(++i > TabLong) //防止溢出
				break ;
		}

		if(st > ed ) return 0 ;
		return m ;
}
时间: 2024-11-05 16:42:18

二分查找算法-精简 稳定的相关文章

二分查找算法的 JavaScript 实现

二分查找在查找[指定值]在[有序]数据中的[位置]时是一种高效的算法. 以下仅提供 ES5 版本. var arr = [0, 2, 4, 27, 28, 54, 67, 74, 75, 79, 86, 97, 289, 290, 678] function binarySearch(arr, val) { var start = 0, end = arr.length - 1; while (start <= end) { var mid = Math.floor((start + end)

算法_001_二分查找算法

 二分查找算法是在有序数组中用到的较为频繁的一种算法,在未接触二分查找算法时,最通用的一种做法是,对数组进行遍历,跟每个元素进行比较,其时间为O(n).但二分查找算法则更优,因为其查找时间为O(lgn),譬如数组{1, 2, 3, 4, 5, 6, 7, 8, 9},查找元素6,用二分查找的算法执行的话,其顺序为:     1.第一步查找中间元素,即5,由于5<6,则6必然在5之后的数组元素中,那么就在{6, 7, 8, 9}中查找,    2.寻找{6, 7, 8, 9}的中位数,为7,7>

Java学习之二分查找算法

好久没写算法了.只记得递归方法..结果测试下爆栈了. 思路就是取范围的中间点,判断是不是要找的值,是就输出,不是就与范围的两个临界值比较大小,不断更新临界值直到找到为止,给定的集合一定是有序的. 自己写的代码: 1 package com.gh; 2 3 import java.util.Arrays; 4 /** 5 * 二分查找算法实现 6 * @author ganhang 7 * 8 */ 9 public class Search { 10 public static void mai

二分查找算法java实现

今天看了一下JDK里面的二分法是实现,觉得有点小问题.二分法的实现有多种今天就给大家分享两种.一种是递归方式的,一种是非递归方式的.先来看看一些基础的东西. 1.算法概念. 二分查找算法也称为折半搜索.二分搜索,是一种在有序数组中查找某一特定元素的搜索算法.请注意这种算法是建立在有序数组基础上的. 2.算法思想. ①搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束: ②如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间

二分查找算法

提到查找算法,最经典的就是二分查找算法了.在二分查找时要在有序的数据里查找目标target,先取中间元素与target比较, 当target小于中间元素的时候,则搜索数组的前半部分,target大于中间元素时,则取数组的后半部分.重复整个搜索的过程 将左半部分与有半部分当作子数组继续查找,直到找到元素或到子数组的大小为0停止. 原理上很简单却有较多细节,尤其是数据边界的取值是否会越界,while循环的条件. java code: public class BinarySearchDemo { p

python函数:递归函数及二分查找算法

本文和大家分享的主要是python的递归函数及二分查找算法相关内容,一起来看看吧,希望对大家学习python有所帮助. 一.递归的定义 def story(): s = """ 从前有个山,山里有座庙,庙里老和尚讲故事, 讲的什么呢? """ print(s) story() story() 老和尚讲故事 递归的定义 -- 在一个函数里再调用这个函数本身.这种魔性的使用函数的方式就叫做 递归 . 递归的最大深度:997 1.python递归最大层

二分查找算法(JAVA)

1.二分查找又称折半查找,它是一种效率较高的查找方法. 2.二分查找要求:(1)必须采用顺序存储结构 (2).必须按关键字大小有序排列 3.原理:将数组分为三部分,依次是中值(所谓的中值就是数组中间位置的那个值)前,中值,中值后:将要查找的值和数组的中值进行比较,若小于中值则在中值前 面找,若大于中值则在中值后面找,等于中值时直接返回.然后依次是一个递归过程,将前半部分或者后半部分继续分解为三部分. 4.实现:二分查找的实现用递归和循环两种方式 5.代码: 1 package other; 2

用C语言实现二分查找算法

二分查找算法思想非常简单,就是折半查找一个有序序列,在这里,我用二分查找一个顺序排列的整形数组.若用C实现的话我们需要注意以下几个方面: 1.如何判断查找完成,定义返回值含义,定义退出循环条件 2.如何处理边界问题,例如1 2 3 这个序列,当我们要查找1或者3时,会不会使程序出现BUG 3.对于数列来说,我们通常用整形存储其下标,二分查找若取下标中间数,则会出现什么样的问题?这些问题是否会影响我们的查找,若有问题,则应该如何规避? 通常情况,作为一个初学者,我甚至觉得二分查找过于简单,不值一提

基础算法介绍 —— 二分查找算法

不知不觉在目前的公司待满3年了,打算回家找份工作.面试中被问到关于算法的题目:有哪些常见的查找算法?下来就把我所掌握的查找算法分享给大家,本文主要介绍二分查找算法. 算法定义(摘自百度):二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表.首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功:否则利用中间位置记录将表分成前.后两个子表,如果