快速排序模板
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);
do j--; while (q[j]>x);
if (i < j)swap(q[i], q[j]);
}
quick_sort(q, l, j), quick_sort(q, j + 1, r);
}
练习
归并排序模板
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 k = 0, i = l, j = mid + 1;
while (i<=mid&&j<=r)
if (q[i] <= q[j])tmp[k++] = q[i++];
else tmp[k++] = q[j++];
while (i <= mid)tmp[k++] = q[i++];
while (j <= r)tmp[k++] = q[j++];
for (i = l, j = 0; i <= r; i++, j++)q[i] = tmp[j];
}
练习
整数二分模板
bool check(int x){}//检查x是否满足某种性质
//区间[l,r]被划分成[l,mid]和[mid+1,r]时使用:
int bserch_1(int l, int r)
{
while (l < r)
{
int mid = 1 + r >> 1;
if (check(mid))r = mid;//check()判断mid是否满足性质
else l = mid + 1;
}
return l;
}
//区间[l,r]被划分为[l,mid-1]和[mid,r]时使用:
int bserch_2(int l, int r)
{
while (l < r)
{
int mid = l + r + 1 >> 1;//从左二分答案当(0,1)可能死循环,所以要+1
if (check(mid))l = mid;
else r = mid - 1;
}
return l;
}
练习
浮点数二分模板
bool check(double x){}//检查x是否满足某种性质
double b_serch_3(double l, double r)
{
const double eps = 1e-6;//eps表示精度,取决于题目对精度的要求,一般比输出位数多2位 e.g:保留6位——1e-8
while (r - 1 > eps)
{
double mid = (l + r) / 2;
if (check(mid))r = mid;
else l = mid;
}
return l;
}
练习
模板参考acwing算法基础课