6.2顺序查找 折半查找 分块查照
顺序查找
主要用于线性表中进行查找。从查找表的一端开始,顺序扫描查找表,依次将扫描到的关键字和待查找的值Key进行比较。如果相等,则查找成功。如果扫描结束仍然没有发现相等的数据元素,则查找失败。
int Search1(int a[],int n,int key){
for(int i=1;i<=n;i++){ //注意从1开始
if(a[i]==key)
return i; //查找成功
}
return 0; // 查找失败
}
优化:设置哨兵
int Search2(int a[],int n,int key){
int i=n;
a[0] =key; //设置“哨兵”
while(a[i]!=key){ //如果不是要找的元素
i--; //从后往前找
}
return i; //如果查找失败也会返回0
}
由于查找有查找成功和失败的两种情况,所以ASL也分为查找成功和是失败的ASL
无论查找成功还是失败,顺序查找的ASL都是关于n的一次多项式,以查找时的元素比较为基本操作,那么我们可以认为顺序查找的时间复杂度为O(n)。
折半查找:
折半查找适用于有序的顺序表。
算法思路:
首先将定值Key与表中的中间位置的关键元素比较,若相等,则查找成功,返回该元素的存储位置u;若不等,则所需要查找的元素只能在中间元素以外的前半部分或者后半部分中。然后缩小范围内继续同样的查找,如此重复直到找到为止,或者确定表中没有所需查找的元素,则查找失败,返回失败的信息。
int Binary_Search(SeqList L,ElemType key,int n){
int low=0,high=n-1;mid;
while(low<=hign){
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;
}
举列子:
查找72:
查找48:
折半查找判定树:
用折半查找的查找过程:
对于折半查找,查找的比较次数也就是从根结点到该结点经历的结点数。
具有N(N>0)个结点的完全二叉树的高度为[log2(N+1)]或者[log2N]+1。
时间复杂度:所以折半查找的时间复杂度为O(Logn)。
ASL:
分块查找(索引顺序查找):
线性表分块:
1)每一块之间都是有顺序的
2)块中存储顺序任意
建立索引表:
typedef struct {
int key; //这个索引块中最大关键字的值。
int low,nunm; //存储索引块中第一个元素下标和块的长。
}indexElem //索引块结构
indexElem index[MaxSize];
算法分析: