计算机基础——7种基础查找算法

本文介绍了计算机基础中的七种查找算法,包括顺序查找、二分查找、插值查找、斐波那契查找、分块查找、哈希查找和树表查找。其中,顺序查找适用于无序数据,时间复杂度为O(n);二分查找要求数据有序,时间复杂度为O(logn);插值查找在分布均匀时更有效;斐波那契查找使用斐波那契数列作为查找点;分块查找通过索引加速查找;哈希查找利用哈希表快速定位,但需处理哈希冲突;树表查找则基于各种树结构进行查找。
摘要由CSDN通过智能技术生成

查找

查找算法的分类:

1.静态查找和动态查找:动态和静态都是相对于表而言的。动态表中有删除和插入操作。
2.无序查找和有序查找:被查找的数列是否有序。

1.顺序查找

基本思想:顺序查找就是按照顺序,从数据结构的一端,顺序扫描,直到查找成功。
平均查找长度ASL:(n+1)/2
时间复杂度:O(n)
代码:

/**
     * 顺序查找
     * 思想:从前到后遍历,直到找到要找的元素,返回元素下标,
     * 优点:二叉查找对于等概率的查找的性能是最优的。
     * 时间复杂度:O(n)
     * @param list
     * @param x
     */
    public static void Sort_Search(int list[],int x){
   
        for(int i=0;i<list.length;i++){
   
            if(list[i] == x){
   
                System.out.println("元素处在第"+i+"位");
            }
        }
    }

2.二分查找

前提:元素必须是有序的。而且是顺序表存储结构
基本思想:将目标元素与位于(1+n)/2位置的元素相比较,如果小于就在小于(1+n)/2的子表中继续上述操作,如果大于,就在大于中间值的子表中查找。
时间复杂度:O(logn)
代码:

/**
     * 二分查找
     * 前提:队列必须是有序的
     * 思想:确定中间位置,然后与待查询值相比,
     *      如果小于,则与左边数组中间值比较,
     *      如果等于,则返回这个值,如果大于,则与右边数组中间值相比较
     *时间复杂度:O(logn)
     * @param list
     * @param x
     */
    public static void Binary_Search(int list[],int x){
   

        Quick_Sort(list,0,list.length-1);
        show_list(list);
        int ad = Recursion(list,x,0,list.length-1);

        System.out.println("元素处在第"+ad+"位");
    }
    /**
     * 二分查找的递归
     */
    public static int Recursion(int list[],int x,int left,int right){
   

        int mid = (left+right)/2;
        if(list[mid] == x )return mid;
        else if(list[mid] > x) return Recursion(list,x,left,mid-1);
        else return Recursion(list,x,mid+1,right);
    }

3.插值查找

基本思想:差值查找法是基于二分法进行改进的算法,与二分法不同的是,差值法选择的不是中间值。而是根据所要查找的数进行自适应选择。mid=low+(key-a[low])/(a[high]-a[low])*(high-low)。
特点:当有序表的元素分布比较均匀时,插值查找比折半查找要好得多。
如果分布不均匀,则会花费更多时间。
时间复杂度:O(log(logn))

/**
     * 插值查找
     * 思想:基于二分查找
     *      定义mid为mid = (high-low)*(key-arr[low])/(arr[high]-arr[low])
     *       中间值的定义,与数组的极大值和极小值有关。
     * 时间复杂度:平均O(loglogn),最坏O(logn)
     * 优点:对于表长较大,而关键字分布又比较**均匀**的查找表来说,插值查找的平均性能比折半查找要好。
     */
    public static void Interpolation_Search(int list[],int x
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值