AcWing基础算法(一)

一、排序

  1. 快速排序
    思想:基于分治。
    算法步骤:
    ① 确定分界点 x(边界点、中间点、随机点 —— 数值;
    ② 调整区间:使得所有 ≤ x 的数在 x 的左边,所有 ≥ x 的数在 x 右边;
    ③ 递归处理左右两段;
void quick_sort(int q[], int l, int r)
{
	if (l >= r) return;
	
	int x = q[l], i = l - 1, j = 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);
	
}
  1. 归并排序
    思想:基于分治。
    算法步骤:(实质:双指针算法)
    ① 选取中间点作为分界点 —— 下标的中间值;
    ② 递归排序左右两侧;
    ③ 归并:将两个有序的数组合并成一个有序的序列;
    时间复杂度:O(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]) 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; i++, j++) q[i] = temp[j];
	
	
}

二、二分
与单调性关系:有单调性一定可以二分,无单调性有可能可以二分

  1. 整数二分
    代码模板:
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;
}

应用示例

#include <iostream>

using namespace std;

const int N = 100010;

int n, m;
int q[N];

int main()
{
	scanf("%d%d", &n, &m);
	for(int i = 0; i < n; i++) scanf("%d", &q[i]);
	
	while( m-- )
	{
		int x;
		scanf("%d", &x);
		
		int l = 0, r = n-1;
		while(l < r)
		{
			int mid = l + r >> 1;
			if (q[mid] >= x) r = mid;
			else l = mid + 1;
		}
		
		if (q[l] != x) cout << "-1 -1" << endl;
		else
		{
			cout << l << ' ';
			
			int l = 0, r = n-1;
			while(l < r)
			{
				int mid = l + r + 1 >> 1;
				if (q[mid] <= x) l = mid;
				else r = mid - 1;
			}
			cout << l << endl;
		}
	}
	return 0;
}
  1. 浮点数二分

示意图

课上:理解算法主要思想
课后:

  • 背过代码模板(理解记忆+默写)
  • 做相应的算法题目(检验背诵)
  • 技巧:题目反复擦掉重写(3-5遍)
  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值