算法竞赛入门经典 第八章总结

今天学长讲高效算法设计这一章,收益良多,特在此写一篇总结,加深记忆~

归并排序:
 

A[l-r]

A[l-mid],A[mid+1,r](两个序列分别按从大到小排列)

p=l;     q=mid+1;

while(p<=mid&&q<=r)

 {

   if(A[p]<A[q])

   B[t++]=A[q++];

  else

    B[t++]=A[p++];

  if(p==mid) (把剩下的q-r直接赋值到B);

  if(q==r) (把剩下的p-mid直接赋值到B);

}


 最后得到的序列整体上就从大到小排列的啦

快排的程序:

int qqsort(int shu[],int left,int right)

{

    int i=left,j=right,middle,key;

    middle=shu[(left+right)/2];

    do

    {

        while(i<right&&shu[i]<middle)i++;

        while(j>left&&shu[j]>middle)j--;

        if(i<=j){key=shu[i];shu[i]=shu[j];shu[j]=key;i++;j--;}

    }while(i<=j);

    if(left<j) qqsort(shu,left,j);

    if(i<right) qqsort(shu,i,right);

    return 0;

}


用二分和递归实现了快速排列,不得不感叹程序的奥秘无穷啊~

二分查找

  给出一个长度为n的序列A1,A2,……,An,求最大连续和。

  

int maxsum(int *a,int x,int y)
{
    int i,m,v,L,R,max;
   if(y-x==1) return a[x];
    m=x+(y-x)/2;
    max=max(maxsum(a,x,m),maxsum(a,m,y));//递归调用分别求出两边最大和,再求其最大值。
   v=0;L=a[m-1];
   for(i=m-1;i>=x;i--)
     L>?=(v+=a[i]);
   v=0;R=a[m];
   for(i=m;i<y;i++)   R>?=(v+=a[i]);//写的是包括中间的最大连续和
   return max>?(L+R);
}


当然还可以用lower_bound()函数和upper_bound()函数。

点此查看这两个函数的详细用法

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值