China Open source community
站内导航:
站内排行前50热点文章

精华文章  GDB调试精粹及使用实例
普通文章  STL中map用法详解
精华文章  负载均衡软件比较(Hapr...
普通文章  头文件的重复引用
普通文章  递归函数的调用过程
普通文章  TCP三次握手/四次挥手详解
普通文章  epoll的实现原理
普通文章  贪心策略的理论基础——...
普通文章  BMH算法原理与实现(模...
普通文章  http请求的详细过程
普通文章  DP动态规划
普通文章  GNU LD用法
普通文章  排列组合与回溯算法
普通文章  Linux内核中的红黑树
精华文章  linux下使用minicom的几...
普通文章  Linux socket编程之套接字
精华文章  Android线程模型
精华文章  enum类型的本质
普通文章  Java开源Html解析类库
普通文章  linux源代码包(.tar.g...
普通文章  L.A.M.P配置过程
普通文章  linux设置环境变量的方法
普通文章  python的memcache和jso...
普通文章  应用程序二进制接口---ABI
普通文章  memcached server LRU ...
普通文章  gcc编译过程概述
普通文章  Java多线程实现简单实例
普通文章  android核心模块及相关...
普通文章  linux内核编译问题
普通文章  brk和sbrk详述
普通文章  Python程序员常用的IDE...
普通文章  C/C++程序员常见面试题...
普通文章  优化C语言代码(程序员必...
普通文章  Unix操作系统的历史演变
普通文章  发行版发布:CentOS 5.4
普通文章  模版函数指针,C++委托...
普通文章  在windows中构建gtk开发...
普通文章  在ubuntu9.10下安装QT4...
普通文章  关于Qvariant类--万能的...
普通文章  Debian sudo 设置
普通文章  i++循环与i--循环的执行...
普通文章  busybox1.15.x 交叉编译
普通文章  python非贪婪,多行匹配...
普通文章  cscope使用简介
普通文章  关于僵死进程zombie
普通文章  [翻译]Django初窥
普通文章  函数指针传递和全局指针...
普通文章  Android Porting Exper...
普通文章  判断链表是否存在环并找...
普通文章  递归思想的妙用

 
 
 
当前位置: 首页 >> 程序设计 >> 数据结构和算法 >> 线型查找和二分法查找
 
 

线型查找和二分法查找

作者:pysub      来源:zz     发表时间:2009-03-26     浏览次数:      字号:    

内容摘要 printf,earch,middle,element,array,Size,high,线型查找,inta,void,else,二分法查找,include,return,inthigh,ound,intlow,found,数组排

   问题:数组查找和数组排序一样,是重要的计算应用之一。电话公司根据姓氏查找,能容易的找到用户的电话号码和缴费情况;学校成绩管理系统可以根据学生的学号,很容易就能查找到学生的成绩及相关资料。查找在生活中的应用十分广泛,数据排序是一个令人感兴趣的问题,这里深入理解两种最基本的算法:线型查找和二分法查找。

   线型查找:把数组的每一个元素和检索关键字比较,按顺序从第一个元素一直检索到要查找的元素,平均来说,程序要把查找关键字与一半的数组元素进行比较。

   二分法查找:线型查找法对小型数组和未排序的数组效果较好,但是,对于大型数据来说,线型查找法效率较低。如果已经对数组排序,那么可以使用速度很快的二分法查找.

程序1:线型查找法实现对某个数的查找!
#include<stdio.h>
#include<stdlib.h>
#define Size 100
int main()
{   int linearSearch(int a[], int key, int size);

    int a[Size], i, searchKey, element;

    for(i=0; i<Size; i++)
        a[i]=2*i;

    printf("Enter integer search key:\n");
    scanf("%d",&searchKey);
    element=linearSearch(a,searchKey,Size);
    if(element!=-1)
        printf("Found value in element %d !\n",element);
    else
        printf("Value is not found!\n");

    system("pause");
}   

int linearSearch(int array[],int key,int size)
{
    int j;
    for(j=0; j<Size; j++)
        if(array[j]==key)
            return j;
    return -1;
}

程序2:二分法查找法实现对某个数的查找!
#include<stdio.h>
#include<stdlib.h>
#define Size 15

int main()
{
    int binarySearch(int [], int, int, int);
    void printHeader(void);
    void printRow(int [],int,int,int);

    int a[Size],i,key,element;
    for(i=0;i <= Size-1;i++)
        a[i]=2*i;

    printf("Enter a number between 0 and 28:");
    scanf("%d",&key);
    printHeader();

    element=binarySearch(a, key, 0, Size-1);
    if(element!=-1)
        printf("\n%d found in array element %d !\n",key,element);
    else
        printf("\n%d is not found!\n",key);
         
    system("pause");
}  

void printHeader()
{
    int i;
    printf("\nSubscripts:\n");
    for(i=0;i<=Size-1;i++)
        printf("%3d",i);
    printf("\n");
    for(i=1;i<=4*Size;i++)
        printf("-");
    printf("\n");
}

int binarySearch(int array[], int searchKey, int low, int high)
{
    void printRow(int array[],int low,int middle,int high);
    int middle;

    while(low<=high){
        middle=(low+high)/2;
        printRow(array,low,middle,high);
        if(searchKey==array[middle])
            return middle;
        else if(searchKey<array[middle])
            high=middle-1;
        else
            low=middle+1;
     }

     return -1;
}

void printRow(int array[],int low,int middle,int high)
{
    int i;
    for(i=0;i<=Size-1;i++)
        if(i<low||i>high)
            printf(" ");
        else if(i==middle)
            printf("%3d*",array[i]);
        else
            printf("%3d",array[i]);
    printf("\n");
}


   效率分析:线型查找摆脱了数组排序的约束,不足之处是不适合大型数据查找,并且查找方法比较老套,如果要找的数是数组中最后一个数n,那么搜索从0开始,一直检索到n,要经过n次遍历,时间复杂度:O(n),而二分查找法中如果查找关键字小于数组中间的元素,就查找数组的头半部分,否则查找数组的后半部分,时间复杂度:O(log2N),如果在指定子数组中还没有查找到关键字,就再把子数组折半,反复进行这种查找,直到要查找的关键字等于子数组中间的元素,或没有找到关键字为止。在最坏的情况下,用二分法查找有1024个元素的数组也只需要比较10次,即用2除1024,连续除10次得到1为止,如果有1048576(2的20次方)个元素,用二分法只要比较20次就可以找到要查找的元素,而用简单的线型查找则需要进行2的20次方查找,可见二分法比线型查找法的效率要高得多,对10亿个元素的数组来说,平均比较5亿次和30次简直是天壤之别!所以掌握二分法对在庞大的数组库处理是很有效的!

编辑 pysub

 
 
 
评论
 
 
发表
 
姓名: QQ:
性别: MSN:
E-mail: 主页:
评分: 1 2 3 4 5
评论内容:
验证码:
  
  • 请遵守《互联网电子公告服务管理规定》及中华人民共和国其他各项有关法律法规。
  • 严禁发表危害国家安全、损害国家利益、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的评论 。
  • 用户需对自己在使用本站服务过程中的行为承担法律责任(直接或间接导致的)。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表网友个人观点,与本网站立场无关。
  •  
    中国源码网 - www.YuanMa.org - 中国 开放源代码+编程 社区