二分

二 分 法
1.典型二分法 : 分金子,找出最重的 和最轻的
#include<iostream>
usingnamespace std;
floata[100];
voidmaxmin(int i,int j,float&fmax,float&fmin)// float&fmin 为值传递,在函数里值变,在主函数里也变。
{
intmid;float lmax,lmin,rmax,rmin;
if(i==j)
{
fmax=a[i];fmin=a[i];
}
elseif(i==j-1)
{
if(a[i]>a[j]){fmax=a[i];fmin=a[j];}
else{fmax=a[j];fmin=a[i];}
}
else
{
mid=(i+j)/2;
maxmin(i,mid,lmax,lmin);
maxmin(mid+1,j,rmax,rmin);
if(lmax>rmax)fmax=lmax;
elsefmax=rmax;
if(lmin<rmin) fmin=lmin;
elsefmin=rmin;
}
}
intmain()
{
intn,i;float max,min;
cin>>n;
for(i=0;i<n;i++)
cin>>a[i];
maxmin(0,n-1,max,min);
cout<<max<<" "<<min<<endl;
return0;
}
——------------------------------------------------------------------------------
3.二分法不独立情况
求数列的最大子段和(处理公共子段)
#include<iostream>
#include<fstream>
usingnamespace std;
intmax_sub_sum(inta[],int left,int right)
{
intleft_sum,right_sum,lefts,rights,s1,s2,mid,i;
if(left==right)
{
if(a[left]>0)
returna[left];
else
return0;
}
else
{
mid=(left+right)/2;
left_sum=max_sub_sum(a,left,mid);
right_sum=max_sub_sum(a,mid+1,right);
lefts=a[mid]; s1=a[mid];
for(i=mid-1;i>=left;i--)
{
lefts=lefts+a[i];
if(lefts>s1)
s1=lefts;
}
rights=a[mid+1];s2=a[mid+1];
for(i=mid+2;i<=right;i++)
{
rights=rights+a[i];
if(rights>s2)
s2=rights;
}
if(left_sum>right_sum&&left_sum>(s1+s2))return left_sum;
if(right_sum>(s1+s2))return right_sum;
return(s1+s2);
}
}
intmain()
{
inta[50];
inti,n;
ifstream cin("a.txt");
cin>>n;
for(i=0;i<n;i++)
{
cin>>a[i];
}
cout<< max_sub_sum(a,0,n-1)<<endl;
return0;
}
----------------------------------------------------------------------------------------------------------------------------
非等分分治
求一组数组中,第二小的数 (分成求 每组数中的前两个小的数,最后一次的返回后在4个数中,可以找到第二小的数)
#include<iostream>
#include<fstream>
usingnamespace std;
inta[50];
voidtwo(int i,int j,float&fmin1,float&fmin2)
{
floatmid,lmin1,lmin2,rmin1,rmin2;
if(i==j)
{
fmin2=a[i];
fmin1=a[i];
return;
}
elseif(i==j-1)
{
if(a[i]>a[j])
{
fmin1=a[j];
fmin2=a[i];
}
else
{
fmin1=a[i];
fmin2=a[j];
}
return;
}
else
{
mid=(i+j)/2;
two(i,mid,lmin1,lmin2);
two(mid+1,j,rmin1,rmin2);
if(lmin1>rmin1)
{
if(lmin1>rmin2)
{
fmin1=rmin1;
fmin2=rmin2;
}
else
{
fmin1=rmin1;
fmin2=lmin1;
}
}
else
{
if(rmin1<lmin2)
{
fmin1=lmin1;
fmin2=rmin1;
}
else
{
fmin1=lmin1;
fmin2=lmin2;
}
}
}
}
intmain()
{
intn;float fmin1,fmin2;
ifstream cin("a.txt");
cin>>n;
inti;
for(i=0;i<n;i++)
{
cin>>a[i];
}
two(0,n-1,fmin1,fmin2);
cout<<fmin2<<endl;
return0;
}
----------------------------------------------------------
----------------------------------------------------------
在一个一维数组中,找到第k个小的数
---------------------------------------------------------------------
===========================================================================================
 
 
 
 
 
 
 
折半查找 排序法(c#)
 
 if(listBox1.Items .Count ==0)
                foundPostion =0;
            else
            {
                endPosition =listBox1 .Items .Count -1;
                while(!found && startPosition <= endPosition )
                    {
                          midPosition =(startPosition+endPosition)/2; 
                          if(double_Array [midPosition ].Equals(double.Parse (s)) )
                           {
                                  found=true;
                                  foundPostion =midPosition ;
                              }
                          else
                          {
                                 if(double_Array[midPosition ].CompareTo (double.Parse (s))>0)
                                       endPosition =midPosition -1;
                                 else
                                     startPosition =midPosition +1;                 
                          }             
                   }
                if (!found)
                    foundPostion = startPosition;
            }
            listBox1.Items.Insert(foundPostion, double.Parse(s));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值