Java 实现选择排序:[通俗易懂的排序算法系列之一]
引言
大家好!从今天开始,我计划写一个关于常见排序算法的系列文章,旨在用通俗易懂的方式,结合 Java 代码实现,帮助大家理解和掌握这些基础但非常重要的数据结构与算法知识。
排序是计算机科学中最基本的操作之一,无论是在日常开发还是面试中,都经常遇到。理解不同排序算法的原理和特性,对于编写高效、健壮的代码至关重要。
本系列的第一篇,我们来聊聊 选择排序 (Selection Sort)。
什么是选择排序?
选择排序是一种简单直观的排序算法。它的核心思想非常符合人类的直觉:
想象一下,你面前有一排高矮不一的人,你想让他们按身高从矮到高排好队。使用选择排序的方法就是:
- 第一轮: 从所有未排序的人中,找到最矮的那个人。然后,让他站到队伍的最左边(也就是第一个位置)。
- 第二轮: 从剩下的未排序的人中,再次找到最矮的那个人。让他站到当前已排好队的人后面(也就是第二个位置)。
- 重复这个过程: 每一轮都从未排序的人中选出最矮的,放到已排序队伍的末尾,直到所有人都排好队。
总结起来,选择排序的工作原理就是:每一轮从未排序的区间中挑选出最小值(或最大值),然后将其放置在已排序区间的末尾(或开头)。
算法步骤详解
以升序排序为例,选择排序的具体步骤如下:
- 初始状态: 整个数组被视为“未排序”区间。
- 第 1 轮:
- 在整个数组(索引
0
到n-1
)中查找最小值。 - 将找到的最小值与数组的第一个元素(索引
0
)交换位置。 - 现在,索引
0
的元素是最小的,属于“已排序”区间;索引1
到n-1
属于“未排序”区间。
- 在整个数组(索引
- 第 2 轮:
- 在未排序区间(索引
1
到n-1
)中查找最小值。 - 将找到的最小值与未排序区间的第一个元素(索引
1
)交换位置。 - 现在,索引
0
到1
的元素已排序;索引2
到n-1
属于未排序区间。
- 在未排序区间(索引
- 重复…
- 第 i 轮:
- 在未排序区间(索引
i-1
到n-1
)中查找最小值。 - 将找到的最小值与未排序区间的第一个元素(索引
i-1
)交换位置。 - 现在,索引
0
到i-1
的元素已排序;索引i
到n-1
属于未排序区间。
- 在未排序区间(索引
- 结束: 当进行到第
n-1
轮时,只需要比较最后两个元素,将较小者放到索引n-2
的位置,最大的元素自然就留在了最后一个位置(索引n-1
)。整个数组排序完成。
图示 (可选): 你可以在 CSDN 编辑器中用简单的文本或上传图片来模拟这个过程,例如:
Initial: [31, 5, 1, 19, 8]
Round 1: Find min (1) in [31, 5, 1, 19, 8]. Swap 1 and 31.-> [1, 5, 31, 19, 8] (Sorted: [1])
Round 2: Find min (5) in [5, 31, 19, 8]. 5 is already at index 1. No swap needed.-> [1, 5, 31, 19, 8] (Sorted: [1, 5])
Round 3: Find min (8) in [31, 19, 8]. Swap 8 and 31.-> [1, 5, 8, 19, 31] (Sorted: [1, 5, 8])
Round 4: Find min (19) in [19, 31]. 19 is already at index 3. No swap needed.-> [1, 5, 8, 19, 31] (Sorted: [1, 5, 8, 19])
Done. Last element (31) is automatically in place.
Java 代码实现
下面是选择排序的 Java 代码实现:
import java.util.Arrays;public class SelectSort { // 类名建议大写开头public static void main(String[] args) {int[] arr = {31, 5, 1, 19, 8, 11, 45, 22, 35, 49, 40, 48, 50};System.out.println("排序前的数组: " + Arrays.toString(arr));standardSelectSort(arr);System.out.println("排序后的数组: " + Arrays.toString(arr));}/*** 标准选择排序:* 每一轮从未排序的部分找到最小值,放到已排序部分的末尾(也就是未排序部分的开头)。* @param arr 要排序的数组*/public static void standardSelectSort(int[] arr) {// 处理边界情况:null 或 长度小于2 的数组无需排序if (arr == null || arr.length < 2) {return;}// 外层循环控制轮数,总共需要 n-1 轮// i 代表当前轮次需要确定最小值的目标位置,也即已排序区间的边界// i 只需要到 arr.length - 2,因为当处理完第 n-1 个元素时,最后一个元素自动就位for (int i = 0; i < arr.length - 1; i++) {// !!! 关键点 1: 记录最小值的索引// 每一轮开始,假设当前未排序部分的第一个元素 (arr[i]) 就是最小的int minIndex = i;// 内层循环:从 i+1 开始遍历剩余的未排序部分,查找真正最小值的索引for (int j = i + 1; j < arr.length; j++) {// !!! 关键点 2: 比较,找到更小的值if (arr[j] < arr[minIndex]) {minIndex = j; // 如果发现更小的值,更新最小值的索引}}// !!! 关键点 3: 交换// 在内层循环结束后,minIndex 就指向了从未排序部分 [i...n-1] 中找到的最小值的索引// 如果最小值的索引不是当前轮次的起始位置 i,则进行交换// 这是一个小优化:如果最小值本身就在位置 i,则无需交换if (minIndex != i) {int temp = arr[i];arr[i] = arr[minIndex];arr[minIndex] = temp;}// (可选) 打印每一轮的结果,方便调试和理解// System.out.println("第 " + (i + 1) + " 轮排序后: " + Arrays.toString(arr));}}
}
代码解读
standardSelectSort(int[] arr)
函数: 接受一个整型数组作为参数。- 边界检查:
if (arr == null || arr.length < 2)
判断数组是否有效且需要排序。 - 外层循环
for (int i = 0; i < arr.length - 1; i++)
:- 控制排序的轮数,从
0
到n-2
,共n-1
轮。 - 变量
i
不仅是轮数计数器,也代表了当前轮次要放置最小值的目标索引,同时也是已排序区间的右边界(不含i
)。
- 控制排序的轮数,从
int minIndex = i;
:- 每一轮开始时,我们假设未排序区间的第一个元素(即
arr[i]
)就是最小的,并记录其索引i
到minIndex
。
- 每一轮开始时,我们假设未排序区间的第一个元素(即
- 内层循环
for (int j = i + 1; j < arr.length; j++)
:- 负责在未排序区间
[i+1, n-1]
中进行查找。 j
从i+1
开始,遍历i
后面的所有元素。
- 负责在未排序区间
if (arr[j] < arr[minIndex])
:- 将当前遍历到的元素
arr[j]
与当前记录的最小值arr[minIndex]
进行比较。 - 如果
arr[j]
更小,就更新minIndex
为j
。
- 将当前遍历到的元素
if (minIndex != i)
和交换操作:- 内层循环结束后,
minIndex
就保存了从未排序区间[i, n-1]
中找到的真正最小值的索引。 - 如果
minIndex
不等于i
,说明最小值不在当前轮次的目标位置i
,需要将arr[i]
和arr[minIndex]
进行交换。使用一个临时变量temp
完成交换。 - 如果
minIndex == i
,说明arr[i]
本身就是这一段的最小值,无需进行交换操作,这是一个小优化。
- 内层循环结束后,
算法特性分析
- 时间复杂度:
- 选择排序包含两层嵌套循环。外层循环执行
n-1
次。内层循环的执行次数从n-1
次(第一轮)递减到1
次(最后一轮)。 - 比较操作的总次数约为
(n-1) + (n-2) + ... + 1 = n*(n-1)/2
,即 O(n²)。 - 交换操作最多发生
n-1
次(外层循环每次最多交换一次)。 - 因此,无论输入数组的初始顺序如何(最好、最坏、平均情况),选择排序的时间复杂度都是 O(n²)。
- 选择排序包含两层嵌套循环。外层循环执行
- 空间复杂度:
- 选择排序是原地排序 (in-place) 算法。它只需要常量级别的额外空间来存储
minIndex
和temp
变量。 - 空间复杂度为 O(1)。
- 选择排序是原地排序 (in-place) 算法。它只需要常量级别的额外空间来存储
- 稳定性:
- 选择排序是不稳定 (unstable) 的排序算法。
- 稳定性指:如果数组中有两个相等的元素,排序后它们的相对顺序保持不变。
- 在选择排序中,考虑数组
[5a, 8, 5b]
(5a
和5b
值相等,但我们用 a/b 区分它们)。- 第一轮,找到最小值
5a
,它已经在位置 0,不交换。数组[5a, 8, 5b]
。 - 第二轮,从未排序的
[8, 5b]
中找最小值,是5b
。将5b
与位置 1 的8
交换。数组变为[5a, 5b, 8]
。
- 第一轮,找到最小值
- 可以看到,原本
5a
在5b
前面,排序后5a
仍然在5b
前面。这个例子没问题。 - 再看
[5a, 5b, 3]
:- 第一轮,找到最小值
3
。将3
与5a
交换。数组变为[3, 5b, 5a]
。
- 第一轮,找到最小值
- 此时,
5b
跑到了5a
的前面,它们的相对顺序改变了。因此,选择排序是不稳定的。
优缺点与适用场景
- 优点:
- 实现简单, 逻辑直观易懂。
- 移动次数少: 对于需要排序的数据,交换(移动)操作的次数是确定的,最多为
n-1
次。如果数据移动成本远高于比较成本,选择排序可能优于某些交换次数更多的算法(如冒泡排序)。
- 缺点:
- 时间复杂度高: O(n²) 的时间复杂度使其在处理大规模数据时效率低下。
- 不稳定。
- 适用场景:
- 数据量较小的排序。
- 教学或理解排序算法原理。
- 当数据移动成本非常高昂时可以考虑(虽然 O(n²) 的比较次数通常是更大的瓶颈)。
总结
选择排序是一种基础的排序算法,通过每轮选择未排序部分的最小值并放到正确位置来实现排序。它的 Java 实现直观,空间复杂度为 O(1),但时间复杂度为 O(n²),且不稳定。
希望通过本文,你对选择排序有了更清晰的认识。这是我们排序算法系列的第一篇,接下来我们会继续探讨其他排序算法,如冒泡排序、插入排序、归并排序、快速排序等。
如果你觉得这篇文章对你有帮助,欢迎点赞、评论、收藏和关注!你的支持是我持续创作的最大动力!
相关文章:
Java 实现选择排序:[通俗易懂的排序算法系列之一]
引言 大家好!从今天开始,我计划写一个关于常见排序算法的系列文章,旨在用通俗易懂的方式,结合 Java 代码实现,帮助大家理解和掌握这些基础但非常重要的数据结构与算法知识。 排序是计算机科学中最基本的操作之一&…...
动画过渡设置
使用Animator的Trigger参数 步骤 1:打开 Animator 窗口 确保你的 Sprite 对象已添加 Animator 组件。 在 Unity 编辑器顶部菜单栏,选择 Window > Animation > Animator,打开 Animator 窗口。 步骤 2:创建 Trigger 参数 在…...
【项目管理-高项】学习方法 整体概览
相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 1.背景 📝 软考高项,全称 信息系统项目管理师 ,是软考高级资格项目之一。 本考试考三门科目:综合知识(上午)、案例分析(下午…...
HarmonyOS应用开发者高级-编程题-001
题目一:跨设备分布式数据同步 需求描述 开发一个分布式待办事项应用,要求: 手机与平板登录同一华为账号时,自动同步任务列表任一设备修改任务状态(完成/删除),另一设备实时更新任务数据在设备…...
HarmonyOS-ArkUI Ability进阶系列-UIAbility与各类Context
UIAbility及相关类关系 一个模块编译的时候会出一个HAP包, 每一个HAP包在运行时都对应一个AbilityStage。 AbilityStage持有一个AbilityStageContext一个APP, 有时候会有很多个HAP包, 至少一个。 一个APP运行时,对应的是我们的App…...
接口并行执行且流式顺序输出的解决方案
接口并行执行且流式顺序输出的解决方案: import asyncio from aiotas_agi2all_llms_utils.output_answer_from_ask_question_results import (reasoning_model_ask_question, ) import os from aiotas_agi2all_llms_utils.logging_utils import create_logger import uuid fr…...
浅谈AI - DeepSpeed - 单卡慎用!
前言 曾在游戏世界挥洒创意,也曾在前端和后端的浪潮间穿梭,如今,而立的我仰望AI的璀璨星空,心潮澎湃,步履不停!愿你我皆乘风破浪,逐梦星辰! 简介 Deepspeed 的 ZeRO(Ze…...
Java Web从入门到精通:全面探索与实战(一)
目录 引言:开启 Java Web 之旅 一、Java Web 基础概念大揭秘 1.1 什么是 Java Web 1.2 Java Web 的优势剖析 1.3 Java Web 相关核心概念详解 二、搭建 Java Web 开发环境:步步为营 2.1 所需软件大盘点 2.2 软件安装与配置全流程 三…...
5G从专家到小白
文章目录 第五代移动通信技术(5G)简介应用场景 数据传输率带宽频段频段 VS 带宽中低频(6 GHz以下):覆盖范围广、穿透力强高频(24 GHz以上):满足在热点区域提升容量的需求毫米波热点区…...
leetcode111 二叉树的最小深度
相对于 104.二叉树的最大深度 ,本题还也可以使用层序遍历的方式来解决,思路是一样的。 最小深度的定义:从根节点到最近叶子节点的最短路径上的节点数量。 特别注意: 如果一个子树不存在,就不能用它来计算深度&#x…...
算法设计学习10
实验目的及要求: 本查找实验旨在使学生深入了解不同查找算法的原理、性能特征和适用场景,培养其在实际问题中选择和应用查找算法的能力。通过实验,学生将具体实现多种查找算法,并通过性能测试验证其在不同数据集上的表现ÿ…...
数字统计题解
题目理解 题目要求计算所有不大于 N 的非负整数中数字 D 出现的总次数。例如,当 D1 且 N12 时,数字1出现在1、10、11(两次)、12中,共5次。 输入输出分析 输入格式: 两个正整数 D 和 N,其中1≤…...
eclipse导入工程提示Project has no explicit encoding set
eclipse导入工程提示Project has no explicit encoding set-CSDN博客...
【网络安全论文】筑牢局域网安全防线:策略、技术与实战分析
【网络安全论文】筑牢局域网安全防线:策略、技术与实战分析 简述一、引言1.1 研究背景1.2 研究目的与意义1.3 国内外研究现状1.4 研究方法与创新点二、局域网网络安全基础理论2.1 局域网概述2.1.1 局域网的定义与特点2.1.2 局域网的常见拓扑结构2.2 网络安全基本概念2.2.1 网络…...
JVM虚拟机篇(五):深入理解Java类加载器与类加载机制
深入理解Java类加载器与类加载机制 深入理解Java类加载器与类加载机制一、引言二、类加载器2.1 类加载器的定义2.2 类加载器的分类2.2.1 启动类加载器(Bootstrap ClassLoader)2.2.2 扩展类加载器(Extension ClassLoader)2.2.3 应用…...
纯个人整理,蓝桥杯使用的算法模板day4(图论 最小生成树问题),手打个人理解注释,超全面,且均已验证成功(附带详细手写“模拟流程图”,全网首个
目录 最小生成树Prim代码模拟流程图 kruskal代码 代码对应实现案例 最小生成树 最小生成树:在无向图中求一棵树(n-1条边,无环,连通所有点),而且这棵树的边权和最小 (ps:可能结果不止…...
学习笔记,DbContext context 对象是保存了所有用户对象吗
DbContext 并不会将所有用户对象保存在内存中: DbContext 是 Entity Framework Core (EF Core) 的数据库上下文,它是一个数据库访问的抽象层它实际上是与数据库的一个连接会话,而不是数据的内存缓存当您通过 _context.Users 查询数据时&…...
Kafka 和 Flink的讲解
一、Kafka:分布式消息队列 1. 核心概念 角色:Kafka 是一个分布式、高吞吐量的消息队列(Pub-Sub 模型),用于实时传输数据流。关键术语: Producer(生产者&…...
Kafka 高吞吐量的原因是什么?
Kafka 的高吞吐量是它成为“数据中枢”的关键特性之一,这背后是多个技术设计的巧妙配合。下面我给你整理一下 Kafka 高吞吐量的主要原因,通俗又系统。 ✅ 1. 顺序写磁盘(磁盘也能飞) Kafka 的消息写入是追加到日志末尾ÿ…...
基于Python+Flask的服装零售商城APP方案,用到了DeepSeek AI、个性化推荐和AR虚拟试衣功能
首先创建项目结构: fashion_store/ ├── backend/ │ ├── app/ │ │ ├── __init__.py │ │ ├── models/ │ │ ├── routes/ │ │ ├── services/ │ │ └── utils/ │ ├── config.py │ ├── requirements.t…...
26.[MRCTF2020]Transform 1
打开文件是可执行程序.exe,打开看一下,顺便拖入ExeinfoPE 查询一下基本信息。如图。 无壳,且是64-bit,打开执行文件也没有什么特别的信息。那就 IDA-x64 分析吧。 🆗,简单的一个加密,我们直接逆…...
LeetCode-98. 验证二叉搜索树
一、题目 给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的…...
【LeetCode Solutions】LeetCode 146 ~ 150 题解
CONTENTS LeetCode 146. LRU 缓存(中等)LeetCode 147. 对链表进行插入排序(中等)LeetCode 148. 排序链表(中等)LeetCode 149. 直线上最多的点数(困难)LeetCode 150. 逆波兰表达式求值…...
leetcode二叉树刷题调试不方便的解决办法
1. 二叉树不易构建 在leetcode中刷题时,如果没有会员就需要将代码拷贝到本地的编译器进行调试。但是leetcode中有一类题可谓是毒瘤,那就是二叉树的题。 要调试二叉树有关的题需要根据测试用例给出的前序遍历,自己构建一个二叉树,…...
【家政平台开发(16)】消息通知系统设计:搭建高效沟通桥梁
本【家政平台开发】专栏聚焦家政平台从 0 到 1 的全流程打造。从前期需求分析,剖析家政行业现状、挖掘用户需求与梳理功能要点,到系统设计阶段的架构选型、数据库构建,再到开发阶段各模块逐一实现。涵盖移动与 PC 端设计、接口开发及性能优化…...
AI比人脑更强,因为被植入思维模型【44】成长破圈思维
giszz的理解:芒格说,不懂不投。我们一生都在追求破圈,突破本我,突破舒适圈、恐惧圈、学习圈、成长圈、自在圈,可是我们真正能懂的知识有实际真的太少了。这个思维模型给我的启迪,一是要破圈,二是…...
【JavaWeb-Spring boot】学习笔记
目录 <<回到导览Spring boot1. http协议1.1.请求协议1.2.响应协议 2.Tomcat2.1.请求2.1.1.apifox2.1.2.简单参数2.1.3.实体参数2.1.4.数组集合参数2.1.5.日期参数2.1.6.(重点)JSON参数2.1.7.路径参数 2.2.响应2.3.综合练习 3.三层架构3.1.三层拆分3.2.分层解耦3.3.补充 &…...
基于GitLab+Jenkins的持续集成实践指南
架构设计原则 分层自动化策略 基础层: 代码提交触发自动构建(100%自动化)中间层: 制品生成与验证(自动化+人工审核)发布层: 环境部署(受控手动触发)工具定位矩阵 工具核心职责关键优势GitLab源码管理+MR流程精细的权限控制Jenkins流水线编排+任务调度插件生态丰富Nexus制…...
用HTML.CSS.JavaScript实现一个贪吃蛇小游戏
目录 一、引言二、实现思路1. HTML 结构2. CSS 样式3. JavaScript 逻辑 三、代码实现四、效果展示 一、引言 贪吃蛇是一款经典的小游戏,曾经风靡一时。今天,我们将使用 HTML、CSS 和 JavaScript 来实现一个简单的贪吃蛇小游戏。通过这个项目,…...
医疗思维图与数智云融合:从私有云到思维图的AI架构迭代(代码版)
医疗思维图作为AI架构演进的重要方向,其发展路径从传统云计算向融合时空智能、大模型及生态开放的“思维图”架构迭代,体现了技术与场景深度融合的趋势。 以下是其架构迭代的核心路径与关键特征分析: 一、从“智慧云”到“思维图”的架构演进逻辑 以下是针对医疗信息化领域…...
Kafka 中,为什么同一个分区只能由消费者组中的一个消费者消费?
在 Kafka 中,同一个分区只能由消费者组中的一个消费者消费,这是 Kafka 的设计决策之一,目的是保证消息的顺序性和避免重复消费。这背后有几个关键的原因: 1. 保证消息顺序性 Kafka 中的每个 分区(Partitionÿ…...
Kafka 中的批次
在 Kafka 中,批次(Batch) 是生产者发送消息的一个重要概念。它对 Kafka 的性能、吞吐量、延迟等有很大影响。批量处理可以使消息发送更高效,减少网络往返和磁盘写入的开销。 下面我将详细解释 Kafka 中的批次机制,包括…...
《UNIX网络编程卷1:套接字联网API》第7章:套接字选项深度解析
《UNIX网络编程卷1:套接字联网API》第7章:套接字选项深度解析 一、套接字选项核心原理 1.1 选项层级体系 套接字选项按协议层级划分(图1): SOL_SOCKET:通用套接字层选项IPPROTO_IP:IPv4协议层…...
使用 pytest-xdist 进行高效并行自化测试
pytest-xdist 是 pytest 的一个扩展插件,主要用于实现测试用例的并行执行和分布式测试。通过利用多进程或者多机分布式的方式,pytest-xdist 能够显著缩短测试执行时间,提升持续集成(CI)流程的效率。 在自动化测试中&a…...
谈谈策略模式,策略模式的适用场景是什么?
一、什么是策略模式? 策略模式(Strategy Pattern)属于行为型设计模式。核心思路是将一组可替换的算法封装在独立的类中,使它们可以在运行时动态切换,同时使客户端代码与具体算法解耦。它包含三个…...
网络安全防御核心原则与实践指南
一、四大核心防御原则 A. 纵深防御原则(Defense in Depth) 定义:通过在多个层次(如网络、系统、应用、数据)设置互补的安全措施,形成多层次防护体系。 目的:防止单一漏洞导致整体安全失效&…...
动态规划2——斐波那契数列模型——三步问题
1.题目 三步问题。有个小孩正在上楼梯,楼梯有 n 阶台阶,小孩一次可以上 1 阶、2 阶或 3 阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模 1000000007。 示例 1: 输入:n 3 …...
周末总结(2024/04/05)
工作 人际关系核心实践: 要学会随时回应别人的善意,执行时间控制在5分钟以内 坚持每天早会打招呼 遇到接不住的话题时拉低自己,抬高别人(无阴阳气息) 朋友圈点赞控制在5min以内,职场社交不要放在5min以外 职场的人际关系在面对利…...
常见的图像生成算法
综合技术原理、优化方向和应用场景,结合经典模型与前沿进展进行分述: 一、经典生成模型 1. 生成对抗网络(GAN) 原理:由生成器(Generator)和判别器(Discriminator)通过…...
PE结构(十五)系统调用与函数地址动态寻找
双机调试 当需要分析一个程序时,这个程序一定是可以调试的,操作系统也不例外。在调试过程中下断点是很重要的 当我们对一个应用程序下断点时,应用程序是挂起的。但当我们对操作系统的内核程序下断点时,被挂起的不是内核程序而是…...
verilog状态机思想编程流水灯
目录 一、状态机1. 状态机基本概念2. 状态机类型3. Verilog 状态机设计要点 二、状态机实现一个1s流水灯三、DE2-115实物演示 一、状态机 1. 状态机基本概念 状态机(Finite State Machine, FSM)是数字电路设计中用于描述系统状态转换的核心组件&#x…...
Java实现N皇后问题的双路径探索:递归回溯与迭代回溯算法详解
N皇后问题要求在NN的棋盘上放置N个皇后,使得她们无法互相攻击。本文提供递归和循环迭代两种解法,并通过图示解释核心逻辑。 一、算法核心思想 使用回溯法逐行放置皇后,通过冲突检测保证每行、每列、对角线上只有一个皇后。发现无效路径时回退…...
#SVA语法滴水穿石# (000)断言基本概念和背景
一、前言 随着数字电路规模越来越大、设计越来越复杂,使得对设计的功能验证越来越重要。首先,我们要明白为什么要对设计进行验证?验证有什么作用?例如,在用FPGA进行设计时,我们并不能确保设计出来的东西没有功能上的漏洞,因此在设计后我们都会对其进行验证仿真。换句话说…...
【Android Studio 下载 Gradle 失败】
路虽远行则将至,事虽难做则必成 一、事故现场 下载Gradle下载不下来,没有Gradle就无法把项目编译为Android应用。 二、问题分析 观察发现下载时长三分钟,进度条半天没动,说明这个是国外的东西,被墙住了,需…...
贪心算法之Huffman编码
1. 算法推理 Huffman 编码的目标是为给定字符构造一种前缀码,使得整体编码长度最短。基本思想是: 贪心选择:每次选择频率最小的两个节点合并。合并后的节点的权值为两个子节点权值之和,代表这部分子树出现的总频率。 局部最优导…...
Flask学习笔记 - 表单
表单处理 基本表单处理:使用 request.form 获取表单数据。使用 Flask-WTF:结合 WTForms 进行表单处理和验证,简化表单操作。表单验证:使用验证器确保表单数据的有效性。文件上传:处理文件上传和保存文件。CSRF 保护&a…...
指针的补充(用于学习笔记的记录)
1.指针基础知识 1.1 指针变量的定义和使用 指针也是一种数据类型,指针变量也是一种变量 指针变量指向谁,就把谁的地址赋值给指针变量 #include<stdio.h>int main() {int a 0;char b 100;printf("%p,%p \n", &a,&b); // …...
【mongodb】mongodb的字段类型
目录 1. 基本数据类型1.1 String1.2 Number1.3 Boolean1.4 Date1.5 Null1.6 ObjectId1.7 Array1.8 Binary Data1.9 Object 2. 特殊数据类型2.1 Regular Expression2.2 JavaScript2.3 Symbol2.4 Decimal1282.5 Timestamp2.6 MinKey/MaxKey2.7 DBPointer 3. 常用字段类型示例4. 注…...
计算机视觉图像处理基础系列:滤波、边缘检测与形态学操作
计算机视觉图像处理基础系列:滤波、边缘检测与形态学操作 一、前言二、滤波:图像的精细化处理2.1 滤波基础概念2.1.1 滤波的本质2.1.2 图像噪声来源与类型 2.2 线性滤波2.2.1 均值滤波2.2.2 高斯滤波 2.3 非线性滤波2.3.1 中值滤波 三…...
实用的alias别名命令——比2=1+1简单的基础命令
目录 alias命令的用处alias命令的写法让alias别名永久存在的办法下篇预告 alias命令的用处 别名,就是linux系统中的命令的别称,而alias命令,可以显示linux系统当前设定的全部别名,当然,也可以自己定义一个别名。 ali…...