学习记录day18——数据结构 算法
算法的相关概念
程序 = 数据结构 + 算法
算法是程序设计的灵魂,结构式程序设计的肉体
算法:计算机解决问题的方法护额步骤
算法的特性
1、确定性:算法中每一条语句都有确定的含义,不能模棱两可
2、有穷性:程序执行一段时间后会自动结束
3、输入:有零个或多个输入
4、输出:至少一个输出,可输出多个
5、可行性:经济可行性、社会可行性、能够运行
算法的设计要求
1、正确性:给定合理的输入数据能够得到正确的结果
2、健壮性:对于给定的不合理的输入数据,能够给出相应的处理措施
3、可读性:程序核心代码写注释、程序代码有缩进、程序代码命名规范
4、高效率:要求设计复杂度尽可能低
5、低存储:要求空间复杂度尽可能低
时间复杂度
算法执行消耗时间的度量
计算公式:T(n) = O(f(n));
T(n):时间复杂度
n:表示问题的规模
f(n):是问题规模与执行次数之间的函数
O(f(n)):使用O阶记法,记录算法时间复杂度
常见的数据复杂度
排序算法
根据数据元素的关键字,按照升序或降序的方式将数据元素重新排列的过程称为排序
排序的分类
1、交换类:冒泡排序、快速排序
2、选择类:简单选择排序、堆排序
3、插入类:直接插入排序、折半插入排序
4、归并类:二路归并、多路归并
冒泡排序
1、在排序过程中,越大(小)的数据,经由交换后,会慢慢的“浮”到顶端,如同气泡一样
2、冒泡排序原理
1)比较相邻元素,如果第一个比第二个大(小)则交换
2)经过一趟排序后会使最大(最小)的元素落到最后 重复上面的步骤,直到没有任何一对 数字需要比较为止
3)当某一趟的排序过程中,出现没有数据交换的过程,则结束整个排序
3、算法
void bubble_sort(int *arr, int n)
{for (int i = 1; i < n; i++) //外循环 控制趟数 {int flag = 0; //定义一个标志位 及 标准位重置for (int j = 0; j < n - i; j++) //内循环 交换位置{if (arr[j] > arr[j+ 1]) //判定是否交换(升序排列){flag = 1; //标志位 置1int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}if (flag == 0) //标志位为0 说明未进入if语句 即排列已完成 直接退出循环{break;}}printf("bubble_sort on\n");
}
选择排序
每次从待排序序列中,找到最大(小)值,将其与待排序序列的第一个进行交换
1、排序步骤:
1)从待排序序列中选择最值
2)如果最值不是待排序序列的第一个,则进行交换
3)从剩余待排序序列中,继续重复前两次的操作,直到,待排序序列为空
2、算法
void select_sort(int *arr, int n)
{int min = 0; //定义一个变量 存储最小值for (int i = 0; i < n; i++){min = i; //记录下标for (int j = i + 1; j < n; j++){if (arr[min] > arr[j]) //更新最小值{min = j;}}if (min != i) //如果最小值不是待排序序列第一个 则换置换{int temp = arr[min];arr[min] = arr[i];arr[i] = temp;}}printf("select_sort on\n");
}
直接插入排序
每次从待排序序列中,选择第一个,将其插入到已排序序列中
1、排序步骤
1)选取待排序序列中的第一个元素
2)跟前面的元素依次比较,如果前面的比当前元素大(小),则将前面的元素后移一位
3)直到出现前面的不比当前的大(小)或者已经到最前面了,将选取的元素,放入空位置上
4)对于待排序序列中的所有元素,重复上述操作
2、算法
void insert_sort(int *arr),int n
{int i,j; //需要在循环外使用for (i = 1; i < n; i++){int temp = arr[i]; //记录要移动的元素数值 for ( j = i-1; temp= < arr[j] && j >= 0; j--) //实现的效果: { //如果记录的数值小于等于已排列序列arr[j+1] = arr[j]; //中的某个数,从那个数开始整体后移} //但实际上是逐个比较,逐个后移arr[j+1] = temp; //后移结束 插入记录的元素数值 }printf("insert_sort on\n");
}
快速排序
快速排序是在序列元素与选定基准元素比较分割为大小两部分的交换排序
时间复杂度:O(nlog2n) n倍以2为底2的对数
1、排序步骤
1)从待排序列中任取一个基准元素
2)与基准元素比较将待排序列分割为大小两部分
3)再对各部分重新选择基准元素并依此规则排序 直到每个部分只剩一个元素为止
2、算法
int part(int *arr,int low ,int high)
{int X = arr[0]; //将第一个元素定为基准while(low < high) //循环条件{while (low < high && arr[low] >= X) //避免错位 {high--;}arr[low] = arr[high]; //将小值前置while (low < high && arr[high] =< X){low++;}arr[high] = arr[low]; //将大值后置}//循环结束 此时 low == higharr[low] = X; //将基准放入指定位置return low; //返回基准下标
}
void quick_sort(int *arr ,int low ,int high)
{if (low => high) {return; //递归出口 只有一个元素时}int mid = part(arr,low,high); //找到基准quick_sort(arr,low,mid-1); //对较小端进行递归quick_sort(arr,mid+1,high); //对较大端进行递归return ;
}
相关文章:

学习记录day18——数据结构 算法
算法的相关概念 程序 数据结构 算法 算法是程序设计的灵魂,结构式程序设计的肉体 算法:计算机解决问题的方法护额步骤 算法的特性 1、确定性:算法中每一条语句都有确定的含义,不能模棱两可 2、有穷性:程序执行一…...
一篇文章带你学完Java所有的时间与日期类
目录 一、传统时间与日期类 1.Date类 构造方法 获取日期和时间信息的方法 设置日期和时间信息的方法 2.Calendar类 主要特点和功能 常用方法 1. 获取当前日历对象 2. 获取日历中的某个信息 3. 获取日期对象 4. 获取时间毫秒值 5. 修改日历的某个信息 6. 为某个信息增…...

利用GPT4o Captcha工具和AI技术全面识别验证码
利用GPT4o Captcha工具和AI技术全面识别验证码 🧠🚀 摘要 GPT4o Captcha工具是一款命令行工具,通过Python和Selenium测试各种类型的验证码,包括拼图、文本、复杂文本和reCAPTCHA,并使用OpenAI GPT-4帮助解决验证码问…...
大学生算法高等数学学习平台设计方案 (第一版)
目录 目标用户群体的精准定位 初阶探索者 进阶学习者 资深研究者 功能需求的深度拓展 个性化学习路径定制 概念图谱构建 公式推导展示 交互式问题解决系统 新功能和创新点的引入 虚拟教室环境 数学建模工具集成 算法可视化平台 学术论文资源库 技术实现的前瞻性…...

机器学习算法与Python实战 | 两行代码即可应用 40 个机器学习模型--lazypredict 库!
本文来源公众号“机器学习算法与Python实战”,仅用于学术分享,侵权删,干货满满。 原文链接:两行代码即可应用 40 个机器学习模型 今天和大家一起学习使用 lazypredict 库,我们可以用一行代码在我们的数据集上实现许多…...

使用WebSocket协议调用群发方法将消息返回客户端页面
目录 一.C/S架构: 二.Http协议与WebSocket协议的区别: 1.Http协议与WebSocket协议的区别: 2.WebSocket协议的使用场景: 三.项目实际操作: 1.导入依赖: 2.通过WebSocket实现页面与服务端保持长连接&a…...

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第五十七章 Linux中断实验
i.MX8MM处理器采用了先进的14LPCFinFET工艺,提供更快的速度和更高的电源效率;四核Cortex-A53,单核Cortex-M4,多达五个内核 ,主频高达1.8GHz,2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…...

每日一题~961div2A+B+C(阅读题,思维,数学log)
A 题意:给你 n*n 的表格和k 个筹码。每个格子上至多放一个 问至少占据多少对角线。 显然,要先 格数的多的格子去放。 n n-1 n-2 …1 只有n 的是一个(主对角线),其他的是两个。 #include <bits/stdc.h> using na…...
Fireflyrk3288 ubuntu18.04添加Qt开发环境、安装mysql-server
1、创建一台同版本的ubuntu18.04的虚拟机 2、下载rk3288_ubuntu_18.04_armhf_ext4_v2.04_20201125-1538_DESKTOP.img 3、创建空img镜像容器 dd if/dev/zero ofubuntu_rootfs.img bs1M count102404、将该容器格式化成ext4文件系统 mkfs.ext4 ubuntu_rootfs.img5、将该镜像文件…...
简化mybatis @Select IN条件的编写
最近从JPA切换到Mybatis,使用无XML配置,Select注解直接写到interface上,发现IN条件的编写相当麻烦。 一般得写成这样: Select({"<script>","SELECT *", "FROM blog","WHERE id IN&quo…...
Windows图形界面(GUI)-MFC-C/C++ - Control
公开视频 -> 链接点击跳转公开课程博客首页 -> 链接点击跳转博客主页 目录 Control 资源编辑器 添加控件 设置控件属性 添加控件变量 添加消息处理 处理控件事件 控件焦点顺序 Control 资源编辑器 资源编辑器:用于可视化地编辑对话框和控件。…...
SQL Server数据库安全:策略制定与实践指南
SQL Server数据库安全:策略制定与实践指南 在当今数字化时代,数据安全是每个组织的核心关注点。SQL Server作为广泛使用的关系型数据库管理系统,提供了一套强大的安全特性来保护存储的数据。制定有效的数据库安全策略是确保数据完整性、可用…...

Spring Boot入门指南:留言板
一.留言板 1.输⼊留⾔信息,点击提交.后端把数据存储起来. 2.⻚⾯展⽰输⼊的表⽩墙的信息 规范: 1.写一个类MessageInfo对象,添加构造方法 虽然有快捷键,但是还是不够偷懒 项目添加Lombok。 Lombok是⼀个Java⼯具库,通过添加注…...
Docker 中安装和配置带用户名和密码保护的 Elasticsearch
在 Docker 中安装和配置带用户名和密码保护的 Elasticsearch 需要以下步骤。Elasticsearch 的安全功能(包括基本身份验证)在默认情况下是启用的,但在某些版本中可能需要手动配置。以下是详细步骤,包括如何设置用户名和密码。 1. …...
面试官:说说JVM内存调优及内存结构
1. JVM简介 JVM(Java虚拟机)是运行Java程序的平台,它使得Java能够跨平台运行。JVM负责内存的自动分配和回收,减轻了程序员的负担。 2. JVM内存结构 运行时数据区是JVM中最重要的部分,包含多个内存区域: …...

Ansible的脚本-----playbook剧本【下】
目录 实战演练六:tags 模块 实战演练七:Templates 模块 实战演练六:tags 模块 可以在一个playbook中为某个或某些任务定义“标签”,在执行此playbook时通过ansible-playbook命令使用--tags选项能实现仅运行指定的tasks。 playboo…...

Mysql开启远程控制简化版,亲测有效
首先关闭防火墙 改表法 打开上图的CMD,输入密码进入,然后输入一下指令 1.use mysql; 2.update user set host % where user root;//更新root用户的权限,允许任何主机连接 3.FLUSH PRIVILEGES;//刷新权限,使更改生效 具体参考…...
【MQTT协议与IoT通信】MQTT协议的使用和管理
MQTT协议与IoT通信:MQTT协议的使用和管理 目录 引言MQTT协议概述 什么是MQTTMQTT的工作原理 MQTT协议的关键特性 轻量级与高效性发布/订阅模式质量服务等级(QoS)持久会话安全性 MQTT协议的使用方法 设置MQTT Broker连接MQTT Client发布消息订阅主题断开连接 MQTT协…...

根据题意写出完整的css,html和js代码【购物车模块页面及功能实现】
🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收…...
AWS免费层之后:了解和管理您的云服务成本
Amazon Web Services (AWS) 为新用户提供了12个月的免费层服务,这是许多人开始使用云服务的绝佳方式。但是,当这一年结束后,您的AWS使用会如何变化?我们九河云通过本文将探讨免费层结束后的AWS成本情况,以及如何有效管…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...
go 里面的指针
指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...
LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》
🧠 LangChain 中 TextSplitter 的使用详解:从基础到进阶(附代码) 一、前言 在处理大规模文本数据时,特别是在构建知识库或进行大模型训练与推理时,文本切分(Text Splitting) 是一个…...
raid存储技术
1. 存储技术概念 数据存储架构是对数据存储方式、存储设备及相关组件的组织和规划,涵盖存储系统的布局、数据存储策略等,它明确数据如何存储、管理与访问,为数据的安全、高效使用提供支撑。 由计算机中一组存储设备、控制部件和管理信息调度的…...