两种简单查找算法之顺序查找和二分查找

来源:互联网 发布:青岛网络内链优化 编辑:程序博客网 时间:2024/05/16 12:19
    查找对于计算机编程来说是非常常见的功能。对于当今的大信息数据时代,计算机对于查找的性能又有了新的挑战,如何设计一个高效的查询,对于系统的性能有着举足轻重的影响。下面我们就来看下最简单的两种查找算法。
    
    顺序查找称得上是最简单的查找算法,其算法思想也比较简单。就是线性表的一段开始,依次将线性表中的数据拿来与需要查找的关键字比较,如果线性表中某个记录的关键字等于给定值,那么查找成功;如果线性表已经遍历完了,还没有查找到对应记录的话,则查找失败。

    顺序查找的思路很简单,下面给出c语言的代码形式:
# include <stdio.h>int seqSearch(int * arr,int n,int num);int main(void){    int arr[10] = {3,8,6,13,22,17,5,9,30,27};    int num = 17;    int result;    result = seqSearch(arr,10,num);        if(result >= 0){        printf("查找成功,查找关键字对应的key是%d:",result);    }else{        printf("查找失败!");    }    return 0;}//顺序查找代码的实现int seqSearch(int * arr,int n,int num){    int i;    for(i=0;i<n;i++){        if(arr[i] == num){            return i;            break;        }    }    return -1;}



    上面的代码很简单。但是他有一定的好处,就是对查找表中的顺序是没有限制的;但是坏处也很明显,因为都要依次给查找表中的数据做对比,所以最坏情况下查找成功需要进行n次比较。数据量大的时候,绝对是不可能考虑的查找算法。

    上面看完了顺序查找,下面再来看一下二分查找。二分查找的思路也比较简单,但是它有一个限制,就是查找表必须是一个顺序集合。二分查找的总体思路是,先拿查找表中的一个中间元素与被查找值进行比较,这里可能有三种情况:
      1.中间元素恰好等于了被查找值,这时查找成功。
      2.中间元素的值小于被查找值,则让它在查找表的后半部分继续进行二分查找。
      3.中间元素的值大于被查找值,则让它在查找表的前半部分继续进行二分查找。
      如果进行到最后,还没有找到被查找元素的话,那么这次证明查找表中没有被查找的元素,则查找失败。

    二分查找在本质上类似于递归的过程,就是在大的方向找不到的话就去小的方向找,直到末尾。下面给出二分查找的代码:
# include <stdio.h>int binarySearch(int * arr,int n,int num);int main(void){    int arr[10] = {3,5,6,8,9,13,17,22,27,30};    int num = 6;    int result;        result = binarySearch(arr,10,num);        if(result >= 0){        printf("查找成功,查找关键字对应的key是%d:",result);    }else{        printf("查找失败!");    }    return 0;}//二分查找主要实现代码int binarySearch(int * arr,int n,int num){    int min = 0;    int max = n-1;    int mid;    while(min<=max){        mid = (min+max)/2;        if(arr[mid] > num){                    max = mid-1;        }else if(arr[mid] < num){            min = mid+1;        }else{            return mid;        }    }    return -1;}

可以看到如果查找表是顺序的话,二分查找的效率上比顺序查找会有一定的提升。其平均算法复杂度o(nlogn)。二分查找在很多地方都有实际应用的情况,比如mysql数据库中在leaf page页上查找数据的时候就用了二分查找法。
原创粉丝点击