二分查找
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.必须按关键字大小有序排列。
【优缺点】折半查找法的优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。
【算法思想】首先,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。
重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。