第一章:C++算法基础之基础算法

news/2024/11/8 16:36:51/

系列文章目录


文章目录

  • 系列文章目录
  • 前言
  • 一、排序
    • (1)快速排序
      • 核心思想
      • 思路分析
      • 模板
    • (2)归并排序
      • 核心思想
      • 思路分析
      • 模板
      • 稳定性
      • 时间复杂度
  • 二分查找
    • (1)整数二分
      • 核心思想
      • 思路分析
      • 模板
    • (2)浮点数二分
      • 核心思想
      • 模板
  • 二、
  • 总结


前言

c++基础算法。


一、排序

(1)快速排序

核心思想

基于分治的思想:

  1. 确定分界点x:取左边界q[l],或者取中间值q[(l+r)/2],或者取右边界q[r],也可以随机。
  2. 调整区间(较难部分):让小于等于x的数在一个区间,大于x的在另一个区间
  3. 递归处理左右两端

在这里插入图片描述

思路分析

思路一:暴力解法,需要额外空间放a b
在这里插入图片描述

思路二:较优美的解法
使用双指针,从数组两端向中间靠拢。指针 i 从左端找大于等于 x 的数,指针 j 从右端找小于等于 x 的数,然后swap二者,直至 i 和 j 相遇。
在这里插入图片描述

模板

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)归并排序

核心思想

也是基于分治的思想:

(1) 确定分界点:mid = ( l + r ) / 2
(2) 递归排序 :left 和 right
(3) 归并(较难部分) :合二为一

思路分析

思路一:双指针left和right:
在这里插入图片描述

left和right指向的数组是有序的,left 和 right 一一比较,将较小的数放进归并数组 res 中,当一个数组走到头后,将另一个数组的剩下部分直接贴到 res 的后面。

模板

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];
}

稳定性

排序算法的稳定性是指:对于原数组中相同的数,若排序后这些相同数的相对位置不发生改变,则该算法是稳定的。
快排是不稳定的,归并是稳定的。

时间复杂度

平均时间复杂度: O(nlogn)
快速排序:每层期望是 n/2 ,递归深度 logn,故平均时间复杂度 O(nlogn)。
归并排序:每层期望是n,递归深度logn,故平均时间复杂度 O(nlogn)。

二分查找

(1)整数二分

核心思想

有单调性一定可以二分,但是可以二分的题目不一定非要有单调性。
找到一个边界将区间划分为两部分,使得一部分满足,另一部分不满足。

思路分析

在这里插入图片描述
第一种情况:红色边界点
check (mid) 判断 mid 是否满足红颜色的性质。注意 mid = ( l + r + 1) / 2 以及更新区间时的 mid 和 mid-1。
在这里插入图片描述

第二种情况:绿色边界点
check (mid) 判断 mid 是否满足绿颜色的性质。注意更新区间时的 mid 和 mid+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;
}

(2)浮点数二分

核心思想

double 可以直接除而不会取整,所以不用在意边界问题,较为简单。
判断条件一般为 r - l >= 1e-6.
次数一般取 保留小数点位数+2,例如保留5位小数,就是1e-7.
也可以不用判断,直接 for 循环100次,相当于除以 2 的100次方,得到的位数足够。

模板

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;
}

二、


总结


http://www.ppmy.cn/news/9019.html

相关文章

C#高级程序设计Type类

C#高级程序设计 一.反射 是.net一种非常重要的机制&#xff0c;通过反射可以在运行时获取类的成员、属性、事件和构造方法等等。有了反射&#xff0c;使我们对类的类型了如指掌。 二.涉及的类 2.1 Type类 System.Reflection命名空间下。 查阅相应的帮助文档。 Name Nam…

python中的多态和抽象类接口

目录 一.多态 抽象类&#xff08;接口&#xff09; 小结 一.多态 多态&#xff0c;指的是:多种状态&#xff0c;即完成某个行为时&#xff0c;使用不同的对象会得到不同的状态。 同样的行为&#xff08;函数&#xff09;&#xff0c;传入不同的对象得到不同的状态 演示 cl…

植物大战僵尸:代码实现无限阳光

通过逆向分析植物阳光数量的动态地址找到阳光的基址与偏移&#xff0c;从而实现每次启动游戏都能够使用基址加偏移的方式定位阳光数据&#xff0c;最后我们将通过使用C语言编写通用辅助实现简单的无限阳光辅助&#xff0c;在教程开始之前我们先来说一下为什么会有动态地址与基址…

[项目说明]-基于人工智能博弈树,极大极小(Minimax)搜索算法并使用Alpha-Beta剪枝算法优化实现的可人机博弈的AI智能五子棋游戏。

个人选题项目 基于人工智能博弈树&#xff0c;极大极小(Minimax)搜索算法并使用Alpha-Beta剪枝算法优化实现的可人机博弈的AI智能五子棋游戏。 设计目标及主要内容 本系统是根据传统五子棋游戏的功能编写&#xff0c;其功能实现了基于AI人工智能算法实现智能的人机对弈五子棋…

如何用LightningChart创建Android图表数据可视化应用程序?(下)

LightningChart JS 是一款高性能的 JavaScript 图表工具&#xff0c;专注于性能密集型、实时可视化图表解决方案。 LightningChart .JS | 下载试用&#xff08;qun&#xff1a;740060302&#xff09;https://www.evget.com/product/4189/download 在上一篇&#xff0c;我们介…

如何避免无效外贸邮件营销?

如何避免无效的邮件营销&#xff0c;米贸搜为您整理如下&#xff0c;希望对您有所帮助:1 .和邮件正文一样重视主题主题对于电子邮件就像标题对于文章或博客一样重要。即使你有全宇宙最吸引人的散文诗&#xff0c;或者最吸引人的求婚&#xff0c;如果根本没有人打开这封邮件&…

S32K144—什么是SBC系统基础芯片?

SBC&#xff08;System Basis Chip&#xff09;芯片在汽车电子领域可谓占一席之地了。那么什么是SBC&#xff1f;怎么用&#xff1f;用在哪里&#xff1f;主要特性&#xff1f; 可以简单理解成&#xff1a;SBC是一类拥有特出功能&#xff08;电源、通信、监控诊断、安全&#…

B树的原理及代码实现、B+树和B*树介绍及应用

目录 一.B树介绍 &#xff08;一&#xff09;.B树存在意义 &#xff08;二&#xff09;.B树的规则 二.B树实现原理及代码 &#xff08;一&#xff09;.实现原理 &#xff08;二&#xff09;.代码 三.B树 &#xff08;一&#xff09;.概念 &#xff08;二&#xff09;.应…