一。快速排序模版
归纳即是:
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;
}