首页 > 其他 > 详细

初识二分法

时间:2021-05-07 00:12:21      阅读:39      评论:0      收藏:0      [点我收藏+]

在一个给定的有序数组中快速寻找某个数的下标

技术分享图片

 

 

 

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std; 
 4 int main()
 5 {
 6     int n;
 7     cin>>n;
 8     int a[n];
 9     for(int i=0;i<n;i++){
10         cin>>a[i];
11     }
12     sort(a,a+n);
13     for(int i=0;i<n;i++){
14         cout<<a[i]<< ;
15     }
16     cout<<endl;
17     int value;
18     cin>>value;
19     int low=0,high=n-1,mid;
20     int ret=1;
21     while(low<=high)
22     {
23         mid=(low+high)/2;
24         if(a[mid]==value){
25             cout<<"the site is:"<<mid;
26             ret=0;
27             break;
28         }else if(a[mid]<value){
29             low=mid+1;
30         }else{
31             high=mid-1;
32         }
33     }
34     if(ret){
35         cout<<"no found";
36     }
37     return 0;
38 }

容易出错的 3 个地方。

1. 循环退出条件是 low<=high,而不是 low<high。

2.mid=(low+high)/2 这种写法是有问题的。因为如果 low和 high比较大的话,两者之和就有可能会溢出。改进的方法是将mid的计算方式写成low+(high-low) 2。更进一步,如果要将性能优化到极致的话,可以将这里的除以 2操作转化成位运算low+((high-low)>>1)或者(low&high)+((low^high)>>1)。相比除法运算来说,计算机处理位运算要快得多。

3.low 和 high 的更新.如果直接写成 low=mid 或者 high=mid,就可能会发生死循环。

 

初识二分法

原文:https://www.cnblogs.com/Knight02/p/14736477.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!