常用查找算法(顺序、二分、插值、分块、斐波那契)

顺序查找

基本思想

  • 属于线性查找和无序查找,从一端开始顺序扫描,直到找到与目标值value相等的元素。
  • 这是最基本的查找方法,也是时间复杂度最高的查找算法。
  • 在数据过多时,这种方法并不适用。

代码实现

//第一种:顺序查找
    public Type SequenceSearch(Type[] list,Type t)
    {
   
        for(Type temp : list)
        {
   
            if(temp.equals(t))
                return temp;
        }
        return null;
    }

分块查找

基本思想

  • 属于顺序查找的改进方法,又叫索引顺序查找。
  • 将n个元素分成m块(m<=n),每个块中元素可以没有顺序,但是m个块之间是有序排列,所以特别适合于节点动态变化的情况
  • 分块查找的速度虽然不如二分查找算法,但比顺序查找算法快得多,同时又不需要对全部节点进行排序。当节点很多且块数很大时,对索引表可以采用折半查找,这样能够进一步提高查找的速度。
  • 那么索引表的构成就是每个块中的最大元素。
  • 查找方式是先对索引表进行二分或顺序查找,选出目标值应该所在的块,然后在块内进行顺序查找。

二分查找

基本思想

  • 属于有序查找算法,也叫折半查找,就是将数组每次选取一半进行查找,怎么选取一半就需要让中间值与目标值value进行比较,因为有序,所以中间值小于目标值则选取后半部分,大于目标值则选取前半部分,依此类推,直到找出与目标值相等的元素,否则返回-1或null。
  • 这种方法有效的缩减查找次数和查找范围,适用于数据量比较大的有序表。
  • 因为前提是有序表,所以对于插入删除等操作过多的数据集并不适用,因为在排序算法上浪费的时间会比较多。
  • 一般的时间复杂度是O(log2n)
  • 有些同学使用二分法参加比赛,注意事项,(high+low)/2这种写法不严谨,因为如果high和low过大时容易产生溢出,mid可以改写成mid=low+(high-low)/2,或者使用位运算mid=low+((high-low)>>1

代码实现

//第二种:二分查找,这里用int类型数组举例,找到中间元素的索引
    //非递归
    public int BinarySearch(int[] list,int value)
    {
   
        int low = 0,high = list.length-1,mid;
        while (low<=high)
        {
   
            mid = (low+high)/2;
            if(list[mid] == value)//如果是寻找String,就用equal
                return mid;
            if(list[mid]>value)
                high = mid-1;
            if(list[mid]<value)
                low=mid+1
  • 74
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 120
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值