线性查找算法

线性查找主要分以下三种情况:
(1)线性查找
(2)二分查找(折半查找)
(3)分块查找

(1)线性查找
在待查数据中进行顺序性轮询查找,当存在待查的数据时返回当前数据索引位置,如果不存在则返回不存在表示-1

平均查找长度: 1/2(n+i)
计算方式:为当前元素查找到的概率乘上所匹配的次数

时间复杂度: O(N)

Java代码实现:

public class 线性查找 {

    public static int search(int[] number,int key){

        int[] temp = new int[number.length+1];
        //设置末尾为监视哨
        for(int i=0;i<number.length;i++){
            temp[i] = number[i];
        }
        temp[number.length] = key;
        int result = 0;
        //进行查找匹对
        for(int i=0;;i++){
            if(temp[i] == key){
                result = i;
                break;
            }
        }
        if(result < number.length){
            return result;
        }else{
            return -1;
        }
    }

    public static void main(String[] args){
        int[] number = {12,24,53241,126,52,35,5263,7};
        int key= 52;
        System.out.println(线性查找.search(number, key));
    }

}

(2)二分查找(折半查找)

特点是待查询的表为有序表,设置一个左标示为0一个右标示为当前数组长度,让当前待查元素与表中间元素进行匹配,如果一致则直接返回中间索引,如果小于中间索引则让右标示等于middle,如果大于中间索引,则让左标示等于middle。

优缺点:
优点就是因为比较的次数大大减少索引效率很高
缺点就是要待查询的表为有序表,这就大大限制的所能操作的领域,并且只对查询效率有所优化,当修改和插入数据的时候这种效率就很低了。因为还有考虑修改或插入之后元素之间顺序的问题。

平均查找长度: (n+1/n)*(log2(n+1))-1

时间复杂度: O(logN)

Java代码实现:

public class 折半查找 {

    public static int halfSort(int[] data,int key){
        int left = 0;//左标记
        int right = data.length-1;//右标记
        int result = -1;
        while(left<=right){ //进行中间判断
            int half = (left+right)/2;
            if(data[half] == key){
                result = half;
                break;
            }else if(data[half] < key){
                left = half;
            }else{
                right = half;
            }
        }
        return result;
    }

    public static void main(String[] args){
        int[] number = {1,2,3,4,5,6,7,8,9,10};
        int key = 6;
        int result = 折半查找.halfSort(number, key);
        if(result == -1){
            System.out.println("当前数据不存在");
        }else{
            System.out.println(result);
        }
    }
}

(3)分块查询
先建立一个索引表,索引表中对当前待查的元素进行了分块处理,每一块中包含了当前块中的最大元素,并且后一块中的元素全部大于之前元素,块的个数一般都是平均分割的。这样当查询某一元素的时候只需要先再确定属于哪一个块,之后再到块中进行查找定位,他的效率是基于顺序查找和折半查找中间的,并且他比折半查找要更加灵活,不在侷限于有序表。

时间复杂度及平均查找长度:
当采用不同顺序查找方式进行分块查找和块内查找不同。
当采用顺序查找时:1/2(n/s + s) +1
当采用折半查找时: log2(n/s + 1) + 1

参考:http://www.cnblogs.com/hanjun/archive/2013/02/05/2892826.html

点赞