二分法和线性查找原理以及实现

时间:2022-10-27 18:10:57

1.二分法查找原理

又称之为折半查找,一种计算复杂度为log(n)的查找方法,与线性查找相比,数量级越大,效率的优势越是明显。但是二分法查找的前提是“已经排序好的线性表”,也就是说,一维数组中的数据必须是已经排序好了,才能使用二分法来进行查找,排序方式没有影响。

二分法和线性查找原理以及实现左侧这张图说明了二分法查找的原理以及查找过程

实现代码

#include <stdio.h>
int search(int array[] , int n , int v);
int search_recursion(int array[] , int low , int high ,  int v);

int main(void){
    int a[10] = {1,2,3,4,5,6,7,8,9,10};//设置有序数组
    int size = (sizeof(a))/(sizeof(a[0]));//提取数组的个数
    int s , sr;
    /*第一种方法*/
    s = search(a , size , 1);
    printf("%d\n", s);

    /*第二种方法*/
    sr = search_recursion(a , 0 , size , 4);
    printf("%d\n" , sr);

    return 0;
}

/*第一种采用了循环迭代的方法*/
int search(int array[] , int n , int v){
    int left , middle , right;
    left = 0 ;
    right = n - 1;

    while(left <= right){
        middle = (left + right)/2;
        if(v > array[middle]){
            left = middle + 1;//折半的过程
        }else if(v < array[middle]){
            right = middle - 1;
        }else{
            return middle;
        }
    }
    return -1;
}

/*第二种采用递归的方法,效率那叫一个猥琐*/
int search_recursion(int array[] , int low , int high ,  int v){
    int middle;
    middle = (low + high) / 2;

    if(low < high){
        if(v > array[middle]){
            return search_recursion(array, middle + 1, high, v);//折半的过程
        }else if(v < array[middle]){
            return search_recursion(array, low, middle, v);
        }else{
            return middle;
        }
    }else if(low == high){
        if(v == array[middle]){
            return middle;
        }else{
            return -1;
        }
    }else{
        return -1;
    }
    return -1;
}

2.线性查找原理

假设一个数组中有 n 个元素,最好的情况就是要寻找的特定值就是数组里的第一个元素,这样仅需要1次比较就可以。而最坏的情况是要寻找的特定值不在这个数组或者是数组里的最后一个元素,这就需要进行 n 次比较。线性查找的计算复杂度为n,查找的快慢和人品有极大的关系,人品爆发,第一个就有机会中奖,人品差,要搜到最后一个才能得出结果,本人取了个别名“线性人品查找”

实现代码

/*线性查找*/
int search_sequential(int array[] , int v , int size){
    int i;
    if(size > 0){
            for(i = 0 ; i < size ; i++){
            if(v == array[i]){
                return i;
                break;
            }
        }
    }
    printf("查找的数据 %d不在数组中\n", v);
    return 0;
}