【算法】AcWing算法基础课笔记 第一章 基础算法 Part 1

news2024/9/27 18:46:36

🚀Write In Front🚀
📝个人主页:令夏二十三
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝
📣系列专栏:AcWing
💬总结:希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🖊

文章目录


前言

        我在大一下时,为了准备蓝桥杯买了AcWing的这套算法基础课,当时只看了前两章的内容,到现在已经隔了好几个月没有练习算法了,模板都生疏了不少,于是想趁暑假有时间,将这套课完整地看完,并记好笔记,在C站上打卡。

        学习课程时,我完整地听完视频,不懂的地方会找题解和博客的思路来理解,每道题的算法模板也会重复敲上三五遍,最后再自己总结笔记。

        今天是我打卡算法学习的第一天,希望接下来可以坚持下去,系统地学完!

        本篇笔记主要介绍了两类基础算法,分别是排序二分,各自还有细分的算法模板,下面让我们一起学习吧。

一、排序算法

我们都知道有八大排序,但是在这里只介绍两种最常用的算法,分别是快速排序和归并排序。

1. 快速排序

快速排序,简称快排,由于它在诸多排序算法中的时间复杂度最小,因此在程序中使用耗时最短,故称之为快速。

排序,就是将一组无序的数字排成从小到大的有序序列,

 怎么做呢?不同的排序算法各有其独特思路,快速排序的核心思路就是分治

分治,就是分而治之,先将无序序列分成 小、中、大 三个部分,从左至右排序,然后对其中的每个部分又按这个方法来排序,先从整体上看有序,到最后最小的细节也有序了,就完成了排序。

具体步骤详解

首先,随机选择序列中的一个数,将其作为排序的分界点:

 然后,在序列中设置指针,分别指向序列的第一个数和最后一个数:

 接下来,如果左边指针所指向的数小于5,则指针向右移动一位,否则停下;若右边指针所指向的数大于5,则向左移动一位,否则也停下。

当两个指针都停下时,交换两个指针所指向的数。

若指针指向的数相同,也就是都移动到了分界点,一次排序就结束了,得到大致有序的序列:

接下来就是对分界点两侧的序列进行同样的排序,每次排序后都可以得到一个更有序的序列,直到序列完全有序:

在实际的代码中,上面的多次细化排序是通过递归实现的。

 代码

#include<iostream>
using namespace std;

const int N=1e6+10;
int n;
int q[N];

void quick_sort(int q[],int l,int r)//l和r分别是数组的左端和右端 
{
	if(l>=r) return;//当数组的右端不大于左端时,可知数组中的数最多只有一个,无需再排序了 
	int x=q[(l+r)/2],i=l-1,j=r+1;//选取x为分界点,i是左指针,j是右指针 
	while(i<j)//当i还在j的左边时,排序尚未结束,需要继续排 
	{
		do i++;while(q[i]<x);//这里的do语句配合了上面i和j的设置,就可以先移动指针,再进行判断 
		do j--;while(q[j]>x);
		if(i<j) swap(q[i],q[j]);//swap函数可以交换数组中下标分别为i和j的位置的数值 
	}
	quick_sort(q,l,j); 
	quick_sort(q,j+1,r);//这里分别对分界点左边部分和右边部分再细致排序 
}

int main()
{
	cin>>n;
	for(int i=0;i<n;i++) cin>>q[i];
	quick_sort(q,0,n-1);
	for(int i=0;i<n;i++) cout<<q[i]<<" ";
	return 0;
}

2. 归并排序

归并排序的中心思想和快排一样,还是分治,但是这里的分治不太一样。

在快排里,我们先排序再递归,而归并则是先递归再排序。

具体步骤详解

归并的过程其实就像它的名字一样,先递归,再合并,合并的过程就是排序的过程。

通过递归,可以将一组无序的序列拆分成若干组只含一个数的序列:

 由图中可看出,每次递归都将序列从中间分成两部分,中间的数归属于左边部分。

接下来,再从递归的最后开始,也就是上图的最后一层开始,逐步将序列两两合并,每次都合并得到一个有序序列,到最后就可以完成排序:

 代码

#include<iostream>
using namespace std;

const int N=1e6;
int n;
int q[N],tmp[N];//这里的tmp数组用来暂存归并后的数组 

void merge_sort(int q[],int l,int r)
{
	if(l>=r) return;
	int mid=(l+r)/2;//mid为数组的中点,用它来将数组分为两部分 
	merge_sort(q,l,mid);
	merge_sort(q,mid+1,r);//用递归的方法将整个数组拆分成一个个只含一个数的序列 
	int k=0,i=l,j=mid+1;//k作为归并数组中的指针 ,i是左边部分的指针,j是右指针 
	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(int i=l,j=0;i<=r;i++,j++) q[i]=tmp[j];//最后将归并数组中的数原封不动地放入原数组 
}

int main()
{
	cin>>n;
	for(int i=0;i<n;i++) cin>>q[i];
	merge_sort(q,0,n-1);
	for(int i=0;i<n;i++) cout<<q[i]<<" ";
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/737873.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python程序设计基础:列表与元组(一)

文章目录 一、列表的表示与访问1、列表的表示2、列表的访问 二、列表的元素操作1、元素的修改2、元素的增加3、元素的删除4、其他操作 三、列表操作1、列表的遍历2、列表的排序3、列表的切片4、列表的扩充5、列表的复制6、列表的删除 一、列表的表示与访问 1、列表的表示 列表…

自营外卖配送平台的商家如何对接第三方美饿的订单

自营外卖跑腿平台对接第三方美饿的好处 单说美团饿了么自身的流量优势&#xff0c;很多商家不能忽视&#xff0c;但是美团饿了么的高额配送成本与抽成&#xff0c;同样也不能忽视。很多商家希望选择自配送或者其他更划算的配送方式来节省成本。这时&#xff0c;区域性的自建外…

【Java】单例模式

单例模式 设计模式概述单例模式实现思路饿汉式懒汉式饿汉式 vs 懒汉式 设计模式概述 设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。设计模式免去我们自己再思考和摸索。就像是经典的棋谱&#xff0c;不同的棋局&#xff0c;我…

AttributeError: module ‘collections‘ has no attribute ‘Iterable‘

vitables 出现 AttributeError: module collections has no attribute Iterable错误修改如下图&#xff1a;

PCIE转PMC载板

描述 这是一款被动适配卡&#xff0c;它支持通过要转换为 PCIe x4 通道边缘连接器的 AMC 接头&#xff0c;来选择 TI EVM&#xff1b;因此它可被插入一个台式计算机或使用 PCIe 接头的任何位置。选定的 TI EVM 支持 DSP 上的本地 PCIe。此卡作为适配器&#xff0c;需要可与 AMC…

Linux与Windows:操作系统的比较与技巧分享

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

Java 动态规划 Leetcode 62. 不同路径

代码展示&#xff1a; class Solution {public int uniquePaths(int m, int n) {//定义dp数组//二维数组多增加一行一列&#xff0c;方便对数组进行初始化int[][]dpnew int[m1][n1];//初始化dp[0][1]1;//填充数组for(int i1;i<m;i){for(int j1;j<n;j){dp[i][j]dp[i-1][j…

@Around踩坑记录

Around踩坑记录 先上结论&#xff1a; 如果你在定义切面的时候打算使用环绕通知➕定义注解的方式&#xff0c;那么在进行*Around*("(annotation(costTrace))") 类似这样的定义的时候&#xff0c;”costTrace“一定要与你定义切面中入参的参数名字一致&#xff0c;而…

【嵌入式Qt开发入门】Qt如何使用多线程——初识QThread

我们写的一个应用程序&#xff0c;应用程序跑起来后一般情况下只有一个线程&#xff0c;但是可能也有特殊情况。比如我们前几篇的例程都跑起来后只有一个线程&#xff0c;就是程序的主线程。线程内的操作都是顺序执行的。但试着想一下&#xff0c;我们的程序顺序执行&#xff0…

模拟日志数据

模拟日志数据。。 日志模拟器主要模拟站点的用户信息和用户行为日志数据 使用shell调用java类实现数据的生产 ! 所需文件如下: datagen.jar genlog.sh 注意: 存储数据的文件夹要预先创建好 Bash mkdir -p /tmp/doit/user_data mkdir -p /tmp/doit/log_data 将用来模拟生成…

【安全】Xsslabs(1~13)基于白盒测试浅析

目录 环境 关卡 level 1 level 2 level 3 level 4 level 5 level 6 level 7 level 8 扩展 level 9 level 10 level 11 level 12 level 13 总结 环境 PHP&#xff1a;php7.3.4nts 中间件&#xff1a;Nginx1.15.11 工具&#xff1a;Hackbar 关卡 level …

超长上下文处理:基于Transformer上下文处理常见方法梳理

原文链接&#xff1a;芝士AI吃鱼 目前已经采用多种方法来增加Transformer的上下文长度&#xff0c;主要侧重于缓解注意力计算的二次复杂度。 例如&#xff0c;Transformer-XL通过缓存先前的上下文&#xff0c;并允许随着层数的增加线性扩展上下文。Longformer采用了一种注意力…

【GLBCXX_3.4.21 not found】问题解决

问题描述 rootlocalhost:/home# rar -h rar&#xff1a;/lib64/libstdc.so.6 ,version "GLBCXX_3.4.21" not found 问题排查过程 下载相应的GCC源码&#xff0c;找到适合自己版本&#xff0c;这里选择是的是7.3.0 gcc源码下载地址&#xff1a;http://ftp.gnu.org/g…

fastadmin数据内容admin_id权限

/*** 是否开启数据限制* 支持auth/personal* 表示按权限判断/仅限个人* 默认为禁用,若启用请务必保证表中存在admin_id字段*/protected $dataLimit true;/*** 数据限制字段*/protected $dataLimitField admin_id;

第一次上传GitHub代码------教程、记录和踩雷

刚录用的一篇论文&#xff0c;编辑要求上传GitHub repo。 对于上传代码&#xff0c;本人是一无所知&#xff0c;写这篇博客记录一下 一. 创建代码仓库 点击右上角&#xff0c;选择New repository&#xff0c;来创建仓库&#xff1a; 根据提示&#xff0c;填写仓库的名称、描述…

TCP 协议(二)连接与断开

TCP 连接概述 TCP 协议是一种面向连接的、可靠的数据传输协议&#xff0c;同时 TCP 连接是全双工的&#xff0c;即连接的两端可以互传数据。在深入了解 TCP 连接之前&#xff0c;我们先来弄清楚整个 TCP 连接的过程&#xff0c;之后在深入整个数据报文结构来认识 TCP。 TCP连…

全网最全,adb常用命令大全(详细)全覆盖,看这篇就够了..

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 adb 模拟按键输入…

python subprocess执行外部命令常用方法

subprocess模块是Python标准库中的一个模块&#xff0c;用于创建和控制子进程。它提供了一种在Python程序中调用其他外部命令、执行系统命令和与系统进程进行交互的方法。常用的有两种方法&#xff1a;subprocess.run()&#xff0c;subprocess.Popen() 1. subprocess.run()方法…

回顾类与对象:掌握String探索其模拟实现的沉浸式体验

目录 一.STL简介二.string的模拟实现1.成员变量与(拷贝)构造、析构函数2.运算符重载[ ]3.添加数据与扩容4.赋值运算符重载及其他重载5.其他函数 一.STL简介 标准模板库 STL是C标准库的重要组成部分&#xff0c;stl分为六大组件&#xff1a;算法、容器、迭代器、空间适配器、仿…

NLP实战7:seq2seq翻译实战-Pytorch复现

&#x1f368; 本文为[&#x1f517;365天深度学习训练营]内部限免文章&#xff08;版权归 *K同学啊* 所有&#xff09; &#x1f356; 作者&#xff1a;[K同学啊] &#x1f4cc; 本周任务&#xff1a; ●请根据N5、N6周内容&#xff0c;为解码器添加上注意力机制 一、前期准备…