ACwing:算法基础课 第一章快排,归并,二分模版整理

一。快速排序模版

归纳即是:
1⃣️判断是否合法
2⃣️确定两个指针变量和边界量
3⃣️开始扫描,两个指针不相遇的时候外层用while内层用do while
4⃣️交换
5⃣️重复左右区间的

void quick_sort(int q[],int l,int r)
{
   if(l>=r) return;//第一步判断是否合法
   //第二步 	确定两个指针和变量
   int i=l-1,j=r+1,x=q[l+r>>1];
   while(i<J)//两个指针不相遇
   {
     do i++ while(q[i]<x);//一直找到>=x的那一位
     do j++ while(q[j]>x);
     //一直找到<=x的那一位
     if(i<j) swap(q[i],q[j]);
     //交换
     } 
     quick_sort(q,l,j);//左边
     quick_sort(q,j+1,r);//右边
}

二。归并排序模版

归纳总结步骤:
1⃣️判断是否合法数组
2⃣️确定中间量,然后开始进行左右递归划分
3⃣️准备归并的前提:即确定好划分后左右区间的起点i,j以及指引temp数组的指针
4⃣️开始进行归并,注意,归并后的结果先存到临时数组temp中,归并的条件判断带等号
5⃣️处理多余的数据,存到temp数组中
6⃣️将temp数组全部转移回原来的数组中

void merge_sort(int q[],int l,int r)
{
   //判断是否合法
   if(l>=r) return;
   //找到中间量
   int mid=l+r>>1
   //划分左右区间
   merge_sort(q,l,mid);
   merge_sort(q,mid+1,r);
   //归并
   int i=l,j=mid+1,ki=0;//注意k为指示temp数组
   while(i<=mid&&j<=r)
   {
     if(q[i]<q[j]) temp[k++]=q[i++];
     else temp[k++]=q[j++];
   } 
   //剩下的加上去
   while(i<=mid) temp[k++]=q[i++];
   while(j<=r) temp[k++]=q[j++];
   //将临时数组存回到原数组中
   for(i=l,j=0;i<=r;j++,i++)
      q[i]=temp[j];
}

三。二分

1。整数二分
注意⚠️!找左边界的时候,if的check函数看左边界的右侧,即在左边界的右侧的即是true,满足性质,即q[mid]>=x,更新右区间。找右边界的时候,if的check函数看右边界的左侧,即在左右边界的左侧的即是true,满足性质即q[mid]=<x,更新左区间。

注意 若只有一个边界,则下面两个模版通用

1⃣️模版一即左边界

bool check(int x)//检查X是否满足某种性质
{ }
int bsearch_1(int l,int r)
{
  while(l<r)
  {
  int mid=l+r>>1;
  if(check(mid)) r=mid;//check()判断mid是否满足性质 即在左边界
  else l=mid+1;
  }
  return l;
 }

2⃣️模版二右边界

bool check(int x)
{}

int bsearch_2(int l,int r)
{
while(l<r)
{
int mid=l+r+1>>1;
if(check(mid))l=mid;
else r=mid-1;
}
return l;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值