6.2顺序查找 折半查找 分块查找

6.2顺序查找 折半查找 分块查照

顺序查找

主要用于线性表中进行查找。从查找表的一端开始,顺序扫描查找表,依次将扫描到的关键字和待查找的值Key进行比较。如果相等,则查找成功。如果扫描结束仍然没有发现相等的数据元素,则查找失败。

[外链图片转存失败(img-2Y2FApBw-1567087331783)(C:\Users\liuhao\AppData\Roaming\Typora\typora-user-images\1567086719056.png)]

int Search1(int a[],int n,int key){
	for(int i=1;i<=n;i++){   //注意从1开始
		if(a[i]==key)
            return i;   //查找成功
    }
    return 0; // 查找失败
}

优化:设置哨兵

[外链图片转存失败(img-xsu1MrEG-1567087331784)(C:\Users\liuhao\AppData\Roaming\Typora\typora-user-images\1567086878579.png)]

int Search2(int a[],int n,int key){
	int i=n;
	a[0] =key; //设置“哨兵”
    while(a[i]!=key){  //如果不是要找的元素
		i--;	//从后往前找
    }
    return i;   //如果查找失败也会返回0
}

由于查找有查找成功和失败的两种情况,所以ASL也分为查找成功和是失败的ASL

[外链图片转存失败(img-1bp0WNMr-1567087331785)(C:\Users\liuhao\AppData\Roaming\Typora\typora-user-images\1567087092512.png)]

[外链图片转存失败(img-YNHyq2Zb-1567087331785)(C:\Users\liuhao\AppData\Roaming\Typora\typora-user-images\1567087056536.png)]
无论查找成功还是失败,顺序查找的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:

[外链图片转存失败(img-EN81UPZx-1567138275514)(assets/1567133832631.png)]

[外链图片转存失败(img-ug2TfaY7-1567138275518)(assets/1567133848252.png)]

[外链图片转存失败(img-l6ZKyxGX-1567138275520)(assets/1567133880236.png)]

查找48:

[外链图片转存失败(img-baN5TbRb-1567138275522)(assets/1567134025892.png)]

[外链图片转存失败(img-8VgOhimj-1567138275523)(assets/1567133990025.png)]

[外链图片转存失败(img-OuGOrYBx-1567138275524)(assets/1567134046400.png)]

[外链图片转存失败(img-Ha73ugSb-1567138275525)(assets/1567134063052.png)]

折半查找判定树:

用折半查找的查找过程:

[外链图片转存失败(img-hneSvJX0-1567138275526)(assets/1567134722291.png)]

对于折半查找,查找的比较次数也就是从根结点到该结点经历的结点数。

具有N(N>0)个结点的完全二叉树的高度为[log2(N+1)]或者[log2N]+1。

时间复杂度:所以折半查找的时间复杂度为O(Logn)。

ASL:

[外链图片转存失败(img-aGvdlKce-1567138275528)(assets/1567136550979.png)]

[外链图片转存失败(img-Cx0USTex-1567138275529)(assets/1567136568168.png)]

分块查找(索引顺序查找):

[外链图片转存失败(img-LXRfRtIu-1567138275531)(assets/1567137699628.png)]

线性表分块:

1)每一块之间都是有顺序的

2)块中存储顺序任意

建立索引表:

typedef struct {
	int key;  //这个索引块中最大关键字的值。
    int low,nunm; //存储索引块中第一个元素下标和块的长。
}indexElem  //索引块结构
indexElem index[MaxSize];

[外链图片转存失败(img-4RodLcCU-1567138275533)(assets/1567138005363.png)]

[外链图片转存失败(img-7exFR6fy-1567138275534)(assets/1567138020534.png)]

算法分析:

[外链图片转存失败(img-PgWpTAh6-1567138275540)(assets/1567138120446.png)]

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值