查找总结(一)-----简单查找和折半查找

先介绍一个概念,平均查找长度(ASL)为每一个关键字出现的概率*查找该关键所进行比较的次数,所有关键字这样的值之和

一.简单查找

    简单查找,也就是一个个地比较了,不多说

int Easy_find(char c[],int n,char key)
{
	int i=0;
	while (i<n&&c[i]!=key)
	{
		i++;
	}
	if (i<n)
	{
		return i;
	}
	else
	{
		return NO_FIND;
	}
}

    时间复杂度分析:while循环最少比较1次,最多比较n次,所以时间复杂度为O(n),另外,平均查找长度为(1+2+....n)*n/2/n=n+1/2;总之,平均查找长度也为O(n),当然,这是在假设每个关键字的概率相同

折半查找

  所谓折半查找,还是借鉴了折半的思想,通过这种方式减少比较的次数,和插入类排序中减少寻找插入位置的时间是一样的,不多说,下面是折半插入的代码

#define NO_FIND -1

//注意! 折半查找需满足两个重要条件:1.元素本来是有序的2.元素必须采用顺序结构...实际上凡是遇到折半的思想,基本都要蛮子这两个条件
int Half_find(char a[],int n,char key)
{
	int low=0;
	int high=n-1;
	while (low<=high)
	{
		int mid=(low+high)/2;
		if (key==a[mid])
		{
			return mid;
		}
		else if (key>a[mid])
		{
			low=mid+1;
		}
		else if (key<a[mid])
		{
			high=mid-1;
		}
	}
	return NO_FIND;

}

  

要注意两点:

      1.折半查找只适用于顺序存储结构

      2.折半查找要求关键字事先是有序的

  顺便总结一下:事实上凡是用到了折半思路的算法基本上都有这两个要求,折半插入排序因为自身的原因,在寻找插入位置的时候,事先肯定是有序的

算法分析:

  折半查找比较的次数可用二叉判定树来判断,注意!,二叉判定树并不是二叉排序树,百度搜索排名第一的那个博客瞎jb说,真是误人子弟,二叉判定树根本就不是一颗完全二叉树,但是他的深度和相同结点数目的完全二叉树是一样的,就是|log2(n)|+1(注:这里两条竖线,是取下值的意思,)

因此,折半查找的比较次数最少为1次,也就是只比较根节点,最多为|log2(n)|+1次,时间复杂度为O(log2(n))平均查找长度也是O(log2(n))级别的,具体值大约为log2(n+1)-1;

分块查找法:

    思路:

        将关键字分为若干块,块有以下特点

          1.块间有序:块间的排序用块内关键字的最大值比较而得

          2.块内无序

    步骤:首先,用折半查找来确定所查关键字所处的块

        然后,在块内用简单查找

时间: 2024-12-25 12:25:10

查找总结(一)-----简单查找和折半查找的相关文章

静态查找表:顺序查找、折半查找、分块查找

引言: 除去各种线性和非线性的数据结构外.另一种在实际应用中大量使用的数据结构--查找表.查找表是由同一类型的数据元素构成的集合. 对查找表常常进行的操作有:1.查找某个"特定的"数据元素是否在查找表中:2.检索某个"特定的"数据元素的各种属性:3.在查找表中插入一个数据元素:4.从查找表中删去某个数据元素.对查找表仅仅作前两种统称为"查找"的操作,则称此类查找表为静态查找表. 若在查找过程中同一时候插入查找表中不存在的数据元素,或者从查找表中删

Java习题(选择,冒泡排序,折半查找)

解决问题如下: 1.求1+2!+3!+...+20!的和. 2.获取数组中的最大和最小值. 3.对数组进行选择排序.冒泡排序. 4.在数组中查找某个数的位置(折半查找). 折半查找:      适合顺序表的查找,数组中存的是按顺序排列的元素,方法如下:定义变量low,mid,high分别指向数组中的最低位,中间和最高位的元素:比较要查找的元素和mid指向的元素,如果比mid大,则在mid和high之间继续查找,low=mid+1; 否则在low和mid之间继续查找,high=mid-1.直到lo

iOS算法(五)之折半查找

二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表. 折半查找法的两种实现 折半查找法思想: 在有序表中,把待查找数据值与查找范围的中间元素值进行比较,会有三种情况出现: 1)     待查找数据值与中间元素值正好相等,则放回中间元素值的索引. 2)     待查找数据值比中间元素值小,则以整个查找范围的前半部分作为新的查找范围,执行1),直到找到相等的值. 3)     待查找数据值

编程成长日记——折半查找

编写一个折半查找函数 #include<stdio.h> //编写折半查找函数 int binsearch(int a,int num[],int b ) { int left=0,right=b-1,mid=0; while(left<=right) {    int mid=(left+right)/2;  if (num[mid]<a) { left=left+1; } else if (num[mid]==a) { return mid; } else { right=mi

折半查找的递归改写

[问题描述] 针对以非递增有序表表示的静态查找表,编写递归的折半查找算法. [输入形式]该静态查找表从下标1开始存放数据,存放数据按照非递增顺序,具体输入形式如下: 5   //输入元素个数 33 29 25 20 12 //按照非递增顺序连续输入多个数,每个数之间用一个空格隔开 29 //输入需要查找的数[输出形式]如果找到则输出该数据在查找表中的下标,如果找不到则输出0 如 查找29则会输出2[样例输入]5 33 29 25 20 12 29 [样例输出] 2 #include<stdio.

算法学习之查找算法:静态查找表(2)有序表查找

如果静态查找表是一个有序表,则可以使用折半查找. 折半查找的过程是:先确定待查记录所在的范围(区间),然后逐步缩小范围直到找到或找不到该记录为止.折半查找过程是以处于区间中间位置记录的关键字和给定值比较,若相等,则查找成功,若不等,则缩小范围,直至新的区间中间位置记录的关键字等于给定值或者查找区间的大小小于零时(表明查找不成功)为止. 关键字key与表中某一元素array[i]比较,有3种情况: 1.key==array[i],查找成功 2.key > array[i],待查找元素可能的范围是a

#查找算法#【1】简单查找:顺序、折半查找

•顺序查找 从线性表的一端开始,依次将每个记录的关键字与给定值进行比较,若某个记录的关键字等于给定值,表示查找成功,返回记录序号:若将线性表中所有记录都比较完,仍未找到关键字与给定值相等的记录,则表示查找失败,返回一个失败值. •折半查找 又称为二分查找.这种查找方法要求查找表的数据是线性结构保存,并且还要求查找表中的数据是按关键字由小到大有序排列. 顺序查找比较简单,依次用数组中的每个元素和要查找的元素进行对比即可.不再贴代码说明 折半查找是一种递归过程,每折半一次,可使查找范围缩小一半,当查

12月28 数组的几种应用(冒泡、折半查找)

*************数组的应用************* 一.冒泡排序(升序.降序) 1.双层循环(循环套循环) (1).冒泡排序是用双层循环解决.外层循环的是趟数,里层循环的是次数.(2).趟数=n-1:次数=n-趟数.(3).里层循环使用if比较相临的两个数的大小,进行数值交换. 二.折半查找(也叫二分法) 1.前提:数组必须有序. 2.主要就是3个未知量. 顶部:topsub 底部:bottomsub 中间:midsub =(topsub+bottomsub)/2 将数组一分为二,然

java 二分查找 - 折半查找算法

二分查找: 这个算法是比较简单的,容易理解的.这个算法是对有序的数组进行查找,所以想要使用这个算法那么 首先先要对数组进行排序. 其实有三个指针,开始指针,末尾指针,中间指针,来开始.折半查找. 步骤如下: 1.确定三个指针,start,end,middleIndex. 2.判断start<=end,如果满足,就执行这个方法,不满足,就返回,找不到. 3.在2的前提下,我们对其折半查找,middleIndex = start+end >> 1,取中间值. 4.判断中间位置的值和目标值是否