数据结构----Java中数组的查找

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013132035/article/details/82662253

线性查找时间复杂度O(n);适合于存储结构为顺序存储或链接存储的线性表。

原理顺序查找也称为线形查找,属于无序查找算法。从数据结构线形表的一端开始,顺序扫描,依次将扫描到的结点关键字与给定值k相比较,若相等则表示查找成功;若扫描结束仍没有找到关键字等于k的结点,表示查找失败。

//线性查找
public class LinearSearch{
    
    public static int linearSearch(int num[], int value){
        //如果数组有序加上下面这个判断效率会更优
        if(num == null || num[0] > value || num[num.length-1] < value){ //不满足条件直接输出
            return -1;
        }
        for(int i = 0; i < num.length; i++){ //查找
            if(num[i] == value){
                return i;
            }
        }
        return -1;
    }
}

二分查找:时间复杂度O(logn);元素必须是有序的

原理:也称为是折半查找,属于有序查找算法。用给定值k先与中间结点的关键字比较,中间结点把线形表分成两个子表,若相等则查找成功;若不相等,再根据k与该中间结点关键字的比较结果确定下一步查找哪个子表,这样递归进行,直到查找到或查找结束发现表中没有这样的结点。

//二分查找
public class BinarySearch{
    
    public static int binarySearch(int num[], int value){
        if(num == null || num[0] > value || num[num.length-1] < value){//不符合条件直接输出-1
            return -1;
        }
        int low = 0, middle, high = num.length-1;
        while(low <= high){
            middle = (low + high) / 2; //折半思想
            if(num[middle] == value){ //如果找到直接返回下标
                return middle;
            }else{
                if(num[middle] > value){
                    high = middle-1;
                }else{
                    low = middle + 1;
                }
            }
        }
        return -1;
    }
}

插值查找:时间复杂度O(logn),和折半思想一样,在定位mid时与折半略有不同,在大数量时会体现其优势所在。

原理:和折半思路一样。算法精华:middle = low + (value - num[low])/(num[high]-num[low]) * (high - low);

//菲波那切查找
public class ChazhiSearch{
    
    public static int chazhiSearch(int num[], int value){
        if(num == null || num[0] > value || num[num.length-1] < value){
            return -1;
        }
        int low = 0, middle, high = num.length-1;
        while(low <= high){
            middle = low + (value - num[low])/(num[high] - num[low]) * (high-low);
            if(num[middle] == value){
                return middle;
            }else{
                if(num[middle] > value){
                    high = middle - 1;
                }else{
                    low = middle + 1;
                }
            }
        }
        return -1;
    }
}

猜你喜欢

转载自blog.csdn.net/u013132035/article/details/82662253