/*静态查找的几种方法*/
#include <stdio.h>
#define MaxSize 20
typedef struct LNode *List;
struct LNode{
ElementType Data[MaxSize];
int length;
};
/*顺序查找(Sequential Search),采用了建立哨兵的查找思想,最好查找复杂度O(1),最坏为O(n),平均查找复杂度为O(n/2)*/
int SequentialSearch(List Tb1,ElementType K)
{
/*在ElementType[1]~ElementType[n]中查找关键字为K的数据元素*/
int i;
Tb1->Data[0]=K; /*建立哨兵*/
for(i=Tb1->length;Tb1->Data[i]!=K;i--);
return i; /*查找成功返回元素所在单元的下标;不成功则返回0*/
}
/*二分查找Binary Search,时间复杂度为O(logN)*/
/*前提n个数据元素的关键字满足有序(排序至少要花费O(nlogn)的时间),并且是连续存放(数组)*/
/*
二分查找判定树:
判定树上的每个结点需要查找的次数刚好等于该结点所在的层数;
查找成功时查找次数不会超过判定树的深度
n个结点的判定树的深度为[log2n]+1
平均成功查找次数ASL=(每层结点数*层数之和)/总的结点数 =log2(n+1)-1
二分查找最坏情况和平均情况相当接近
二分查找插入删除都必须移动大量的结点,二分查找适合那种一经建立就很少改动,而又经常需要查找的线性表
对于那些查找少而又经常需要改动的线性表,可以采用链表作为存储结构,经行顺序查找,链表无法实现二分查找
*/
/*假设有13个数据元素,按照关键字由小到大顺序存放,二分查找关键字为444的数据元素过程*/
int BinarySearch(List Tbl,ElementType K)
{ /*在表Tbl中查找关键字为K的数据元素*/
int left,right,NotFound=-1;
left=1; //初始左边界
right=Tbl->length; //初始有边界
while(left<=right)
{
mid=*(left+right)/2; //计算中间元素坐标
if(K<Tbl->Data[mid]) right=mid-1; //调整右边界
else if(K>Tbl->Data[mid]) left=mid+1; //调整左边界
else return mid; //查找成功,返回数据元素下标
}
return NotFound //查找不成功,返回-1
}
静态查找方法(顺序查找与二分查找)
最新推荐文章于 2024-01-31 10:21:09 发布