2023.9.19
1、快速排序—分治
步骤:确定分界点、调整区间、递归处理左右两段区间
期望值:nlogn
【快排模板】
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);
}
2、归并排序
步骤:确定分界点、递归排序左边和右边区间、归并两个有序的数组
稳定的:nlogn
【归并模板】
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];
}
3、二分法
(1)整数二分
步骤:找中间值、判断中间值是否满足条件、改变区间端点
[两种模板注意区分]:l=mid时,mid选取要加1;r=mid时,mid选取不用变。

bool check(int x) {/* ... */} // 检查x是否满足某种性质
// 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用:
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;
}
// 区间[l, r]被划分成[l, mid - 1]和[mid, r]时使用:
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;
}
(2)浮点数二分
bool check(double x) {/* ... */} // 检查x是否满足某种性质
double bsearch_3(double l, double r)
{
const double eps = 1e-6; // eps 表示精度,取决于题目对精度的要求
while (r - l > eps)
{
double mid = (l + r) / 2;
if (check(mid)) r = mid;
else l = mid;
}
return l;
}
本文详细介绍了快速排序、归并排序以及整数和浮点数的二分查找算法,包括它们的基本步骤、期望时间复杂度和示例代码。

被折叠的 条评论
为什么被折叠?



