网络推荐



本广告位招租!

推荐给好友 上一篇 | 下一篇

线型查找和二分法查找

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

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

yV9K,YQY m@.oVBSD爱好者乐园ei(Rem.M&L{

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

_gN!W W$GN程序1:线型查找法实现对某个数的查找!
7eb|8U(k8K#include<stdio.h>
:w UX3_g u#include<stdlib.h>
.pP^ ` qC3V#define Size 100BSD爱好者乐园?OV_ m(q,S&?M
int main()
sxj_(c'{3Z{   int linearSearch(int a[], int key, int size);

)A} Hl^ el

Lm8s'h-{Z'[    int a[Size], i, searchKey, element;

u^(O1}/R r z

YWsCf!Ba    for(i=0; i<Size; i++)
*Y+^.IcqO/S        a[i]=2*i;

2ki`m\!{u

r9h*CSFq!t-[    printf("Enter integer search key:\n");BSD爱好者乐园rB\5OP ld
    scanf("%d",&searchKey);
)rH}6Ck!V}    element=linearSearch(a,searchKey,Size);
gngv/I_/?;OY    if(element!=-1)
_ V#Q1y [zb/\X        printf("Found value in element %d !\n",element);
bvS,L_Y@iu.~    else
k'Xt"S9Y.y!n        printf("Value is not found!\n");BSD爱好者乐园'a$vH_"K.Z

BSD爱好者乐园?0yG6v:B

    system("pause");BSD爱好者乐园n+?.qO b/O1y*rc
}   BSD爱好者乐园HH c?.H

BSD爱好者乐园[Yf L3RoZ/Hw

int linearSearch(int array[],int key,int size)BSD爱好者乐园/f C gD$`9R
{
~M Y9@:a Ouh:e    int j;BSD爱好者乐园&KHSW&] [
    for(j=0; j<Size; j++)BSD爱好者乐园.jv2^$HX
        if(array[j]==key)
uf {V-w+`v            return j;BSD爱好者乐园h`Ger9Hj!D
    return -1;
I1k:E1dC}

2U)t;bn U;T?4g%r

,qv J lI0o/F程序2:二分法查找法实现对某个数的查找!BSD爱好者乐园/cLu#I sn
#include<stdio.h>BSD爱好者乐园K"Q'bB%sR
#include<stdlib.h>BSD爱好者乐园SD3Wqt
#define Size 15BSD爱好者乐园9i]R-Z4H~ K2v3Hj

BSD爱好者乐园i3Phl r!|^S

int main()BSD爱好者乐园Tr/MLil
{BSD爱好者乐园#O{~#y9U
    int binarySearch(int [], int, int, int);
}z5Ee Q.|^W;i\    void printHeader(void);BSD爱好者乐园%r e5bQ0_L3muw
    void printRow(int [],int,int,int);

s(nT0C U9nH

Cdb D+Q3a    int a[Size],i,key,element;BSD爱好者乐园 S6no c@!G
    for(i=0;i <= Size-1;i++)
hYqEo2J        a[i]=2*i;BSD爱好者乐园$c1g9H U#^dpW$o

g0JOl6R[t6Jn;T(LO    printf("Enter a number between 0 and 28:");
#h0zJ#U@"Q"` b    scanf("%d",&key);BSD爱好者乐园$cY,LC/VKWN7r ]
    printHeader();BSD爱好者乐园x9m8Ez q+EN]K

?3i5U Q|7R    element=binarySearch(a, key, 0, Size-1);
Pg f*N#k5P8p:v q j    if(element!=-1)BSD爱好者乐园zWn B4X&T
        printf("\n%d found in array element %d !\n",key,element);BSD爱好者乐园 R6FUj^y
    elseBSD爱好者乐园ico{?`n6ml~
        printf("\n%d is not found!\n",key);BSD爱好者乐园:{sV&J5lO
         BSD爱好者乐园 zpb&X*ry+H
    system("pause");BSD爱好者乐园7a:UB8^C
}  
,Ig)_;Y^lB2W!hBSD爱好者乐园L| fI.?3RA
void printHeader()
#V&w cwUO)T{BSD爱好者乐园/v.gO1cAKFG&`
    int i;
%?)F9W5X"Q$}~A    printf("\nSubscripts:\n");
l'?aT(]1Bc9x    for(i=0;i<=Size-1;i++)
'^/y"db.mE        printf("%3d",i);
5G+?)a,b Y v"U$A    printf("\n");
1A0J|b4N#D]O)N2B    for(i=1;i<=4*Size;i++)BSD爱好者乐园aVFD4al,B*Kl
        printf("-");BSD爱好者乐园t1^ g\T&?
    printf("\n");
|$K)`M-yG)l}

ueC{F'}

k;V ZPXXint binarySearch(int array[], int searchKey, int low, int high)BSD爱好者乐园](b["I[-Uu[
{BSD爱好者乐园]3B s&~c+k5EG8m;Z
    void printRow(int array[],int low,int middle,int high);
!lO J8O,kb:t{9Z/`    int middle;BSD爱好者乐园~:H%G([TA/Tds/A,m

K1D,G)dVg&N    while(low<=high){BSD爱好者乐园;N&o oA{6z7J\%J
        middle=(low+high)/2;
k? G;Y6Oj$J-g(U        printRow(array,low,middle,high);BSD爱好者乐园p7} W(WoI,U V}y
        if(searchKey==array[middle])BSD爱好者乐园R l$^0k"^ ~x
            return middle;BSD爱好者乐园4b:p1R+j:VVr?B
        else if(searchKey<array[middle])BSD爱好者乐园fw!el2P;f
            high=middle-1;BSD爱好者乐园0K5Vj2V2G.M7NI
        elseBSD爱好者乐园Tt$N wsolV\2G
            low=middle+1;BSD爱好者乐园clS#~ dMu"Gv&N
     }BSD爱好者乐园.V8kV`1]H NunZ

BSD爱好者乐园8P!~,] i,P

     return -1;BSD爱好者乐园a6s4soYb^
}BSD爱好者乐园"ST)o ~ }V1U3Cb

BSD爱好者乐园*Vct X|f

void printRow(int array[],int low,int middle,int high)BSD爱好者乐园%Z!i+e4|,za*H XX
{BSD爱好者乐园 n$XK P+?)ta
    int i;BSD爱好者乐园VRSH9XNfV
    for(i=0;i<=Size-1;i++)
3[ bf&bI'w:~HW        if(i<low||i>high)
h'T;z b/IU2tz4P            printf(" ");
?'R[)SA%o        else if(i==middle)
t6j;Shh LIt            printf("%3d*",array[i]);BSD爱好者乐园k+L#c.d#_P
        else
Q7T%}?U$I            printf("%3d",array[i]);BSD爱好者乐园(P$Y2\ S2b+vh
    printf("\n");
@%?"A yz(bp}

0~4J9QC@ A

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


[版权声明]BSD爱好者乐园站内文章,如来源不是互联网,则均系原创或翻译之作,可随意转载,或以此为基础进行演译,但务必以链接形式注明原始出处和作者信息,否则属于侵权行为。另对本站转载他处文章,俱有说明,如有侵权请联系本人,本人将会在第一时间删除侵权文章。
TAG: 线型查找 二分法查找
 

评分:0

我来说两句

seccode