数据结构(九):查找——顺序查找、折半查找(动图)

目录

一、顺序查找

1.一般(无序)线性表的顺序查找【有哨兵】

2.有序表的顺序查找

二、折半查找


一、顺序查找

        顺序查找又称为线性查找,既适用于顺序表,又适用于链表。

1.一般(无序)线性表的顺序查找【有哨兵】

基本思想:

        这是一种最直观的查找方法!

        从线性表的一端开始,逐个检查关键字是否满足给定的条件:

        · 若满足,则查找成功!返回该元素在线性表中的位置。

        · 若已经找到表的另一端,则返回查找失败的信息!

哨兵的作用:

        我们将待查找线性表的 0 号位置定义为“哨兵”!并将这个位置赋值为关键字key。

        查找时,从后向前查找,如果没有查找成功,那么在 i==0 (即哨兵位置)时必定会跳出循环。

        这样,我们就不必判断数组是否会越界!

代码片段:

# define Elemtype int

typedef struct
{
	Elemtype* elem; //元素存储空间基址,建表时按实际长度分配,0号单元留空
	int TableLen; //表的长度
} SSTable;

int Search_Seq(SSTable ST,Elemtype key)
{
	ST.elem[0] = key; //"哨兵"
	for (int i = ST.TableLen; ST.elem[i] != key; --i) //从后往前找
		return i; //若查找失败,返回0,退出循环
}

拓展:

ASL(成功)= (n+1)/2

ASL(不成功)= n+1

2.有序表的顺序查找

  即待查找的线性表是有序的!

  当查找失败时,可以不用比较到表的另一端就能返回查找失败信息,降低了平均查找长度

拓展:

ASL(成功)= (n+1)/2

ASL(不成功)= n/2+n/(n+1)

二、折半查找

        折半查找又称为二分查找,仅适用于有序的顺序表。

基本思想:

        首先将给定的 key 与表中间位置的元素比较:

        · 若相等,则查找成功!返回该元素的存储位置。

        · 若不等,则所需查找的元素只能在中间元素以外的前半部分或后半部分。如此继续。

动画演示:

数据结构(九):查找——顺序查找、折半查找(动图)_第1张图片

代码片段:

int Binary_Search(SeqList L,Elemtype key)
{
	int low = 0, high = L.TableLen - 1, mid;
	while (low <= high)
	{
		mid = (low + high) / 2; //取中间位置
		if (L.elem[mid] == key)
			return mid; //查找成功
		else if (L.elem[mid] > key)
			high = mid - 1;
		else
			low = mid + 1;
	}
	return -1; //查找失败,返回-1
}

拓展:

1.折半查找可用二叉树来表示,称为判定树。判定树是一颗平衡二叉树。如图:

数据结构(九):查找——顺序查找、折半查找(动图)_第2张图片

 2.判定树的树高(不包含失败节点):h=\left \lceil log_{2}(n+1) \right \rceil

你可能感兴趣的:(数据结构,数据结构,c++)