二分查找

 1 #include <iostream>  
 2 using namespace std;  
 3 typedef int KeyType;  
 4   
 5 /************************************************************************/  
 6 /* 二分查找方法        (数组必需要是有序的)                           */  
 7 /* a[]为待查找的数组,要求是有序的;n为数组的长度;k为查找的关键字        */  
 8 /************************************************************************/  
 9 int BinSearch(KeyType a[],int n,KeyType k)  
10 {  
11     int low=0,high=n-1,mid;                //取两端  
12     while (low<=high)                        
13     {  
14         mid=(low+high)/2;                  //二分取中间位置  
15         if (a[mid]==k)  
16         {  
17             return mid;  
18         }  
19         else if (a[mid]>k)  
20         {  
21             high=mid-1;  
22         }  
23         else  
24         {  
25             low=mid+1;  
26         }  
27     }  
28     return -1;  
29 }  
30   
31 /************************************************************************/  
32 /* 主函数                                                               */  
33 /************************************************************************/  
34 int main()  
35 {  
36     int a[50],i,n,k;  
37     cout<<"待查找数组的个数: ";  
38     cin>>n;  
39     cout<<"待查找数组的元素: ";  
40     for (i=0;i<n;i++)  
41     {  
42         cin>>a[i];  
43     }  
44     cout<<"要查找的元素:     ";  
45     cin>>k;  
46     i=BinSearch(a,n,k);  
47     if (i==-1)  
48     {  
49         cout<<"查找不到你所要查找的。"<<endl;  
50     }  
51     else  
52     {  
53         cout<<"所要查找元素位于第"<<i+1<<"个。"<<endl;  
54     }     
55     return 0;  
56 }  

二分查找又称折半查找,它是一种效率较高的查找方法。

  【二分查找要求】:1.必须采用顺序存储结构 2.必须按关键字大小有序排列

  【优缺点】折半查找法的优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。

  【算法思想】首先,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。

  重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

posted @ 2013-03-26 13:20  zhxiang  阅读(194)  评论(0编辑  收藏  举报