01_查找算法_顺序查找_二分查找

顺序查找

基本思想

从表的一端开始,顺序扫描表,依次将扫描到的结点关键字和给定值(假定为a)相比较,若当前结点关键字与a相等,则查找成功;若扫描结束后,仍未找到关键字等于a的结点,则查找失败。

说白了就是,从头到尾,一个一个地比,找着相同的就成功,找不到就失败。很明显的缺点就是查找效率低。

适用于线性表的顺序存储结构和链式存储结构。
这里写图片描述

计算平均查找长度

例如上表,查找1需要1次,查找2需要2次,依次往下推,可知查找16需要16次,
可以看出,我们只要将这些查找次数求和(我们初中学的,上底加下底乘以高除以2),然后除以结点数,即为平均查找长度。
设n=节点数
平均查找长度=(n+1)/2

用Java实现

import java.util.Scanner;  
public class SequentialSearch {  
    int a[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51};  
    public SequentialSearch(){  
        System.out.println("请输入要查询的数字:");  
        Scanner input=new Scanner(System.in);  
        int input1=input.nextInt();  
        for(int i=0;i<a.length;i++){  
            if(a[i]==input1){  
                System.out.println(input1+"的位置为:"+i);  
                break;  
            }  
            if(i==a.length-1)  
                System.out.println("No Result!");  
        }  
    }   
}

二分查找

基本思想

这里写图片描述

平均查找长度=Log2(n+1)-1

注:虽然二分法查找的效率高,但是要将表按关键字排序。而排序本身是一种很费时的运算,所以二分法比较适用于顺序存储结构。为保持表的有序性,在顺序结构中插入和删除都必须移动大量的结点。因此,二分查找特别适用于那种一经建立就很少改动而又经常需要查找的线性表。
用折半查找时序列必须是有序的!

用Java实现

import java.util.List;  
public class binarySearch {  
    public binarySearch(){  
        List<Integer> list=new ArrayList<Integer>();  
        for(int i=0;i<10000;i+=2){ //往list加入逐渐增大1-10000的所有偶数,作为实验数组,很明显,他是有序的!  
            list.add(i); //这里当然也可用数组  
        }  
        int low=0;  
        int high=list.size();  
        int key=3334;  
        while(low<=high){  
            int mid=(low+high)/2;  
            if(key==list.get(mid)){  
                System.out.println("此数值在list中的位置为:"+mid);  
                break;  
            }  
            if(key>list.get(mid)){  
                low=mid+1; //当小于时,是low指针向后移动,high指针不变  
            }  
            if(key<list.get(mid)){  
                high=mid-1;        //当大于时,是high指针向前移动,low指针不变  
            }    
        }  
        if(low>high){  
            System.out.println("没有查到结果!");  
        }  
    }   
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值