自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(67)
  • 资源 (2)
  • 收藏
  • 关注

原创 MySQL主从延迟的解决方案

之前项目中基于 MySQL 主从复制以及 AOP 的方式实现了读写分离,也写了博客记录了这个实现过程,《SpringBoot实现MySQL读写分离》。既然配置了 MySQL 主从复制,那么自然会存在主从延迟,如何尽可能减小主从延迟对应用系统的影响是很有必要的思考点,我个人认为主从延迟的解决方案正是实现读写分离、MySQL 主从复制的精髓。关于这个话题其实我之前就想着写篇博客分享一下,但一直没有提上日程。最近有读者在《SpringBoot实现MySQL读写分离》 这篇博客中留言问到了这个问题,这也激励我写

2022-05-29 17:29:51 11271 4

原创 基于Redis3.0与6.0版本源码看SDS内存优化

实践中引发的思考最近在看《Redis 设计与实现》这本书,不由得赞叹 Redis 底层数据结构设计的精妙。在看到 Redis 对象章节时,我们知道 Redis 是使用对象来表示数据库中的键和值的,其中键总是字符串对象,而字符串对象的编码又可以是 int、raw 或者 embstr 。关键点来了,书中对字符串对象是这么写的:如果字符串对象保存的是一个字符串值,并且这个字符串值的长度小于等于 39 字节,那么字符串对象将使用 embstr 编码的方式来保存这个字符串值。看到这,我马上实践了一波,结

2021-11-28 23:25:53 691

原创 Aviator 表达式求值引擎——使用自定义函数应对复杂的业务场景

自定义函数只需要实现接口,并注册到 AviatorEvaluator 即可使用。AviatorFunction 接口十分庞大,通常来说你并不需要实现所有的方法,只要根据你的方法的参数个数,继承AbstractFunction类并重写相应方法即可。

2023-02-27 11:52:53 3986 1

原创 前端学习笔记(Vue、TypeScript、JavaScript)

function 函数名(参数) {// 函数体 return 结果;js 中的函数调用特点:对参数的类型和个数都没有限制,例如// 返回 ab add(4 , 5 , 6);// 返回 9, 第三个参数没有被用到, 不会报错 add(1);// 返回 NaN, 这时 b 没有定义是 undefined, undefined 做数学运算结果就是 NaN再新建 store 目录来管理共享数据,下面是 /src/store/UserInfo.tsreturn {${return {

2023-01-06 16:30:21 974

原创 Dubbo入门实战(SpringBoot + Nacos)

本文主要介绍 Dubbo 3.0 整合 SpringBoot 的样例,这里使用 Nacos 作为注册中心,读者也可以使用 Zookeeper,项目结构为:接口服务 interface-service一、定义实体类注意要实现 接口。二、定义接口UserServiceOrderService服务提供者 user-service-provider一、application.yml二、UserService实现类核心注解 用于暴露 Dubbo 服务。三、启动类注解

2022-11-23 22:25:12 1891

原创 Sentinel 滑动窗口实现原理(源码分析)

我们知道,Sentinel 可以用来帮助我们实现流量控制、服务降级、服务熔断,而这些功能的实现都离不开接口被调用的实时指标数据,本文便是关于 Sentinel 是如何实现指标数据统计的。上图中的右上角就是滑动窗口的示意图,是 StatisticSlot 的具体实现。StatisticSlot 是 Sentinel 的核心功能插槽之一,用于统计实时的调用数据。,底层采用高性能的滑动窗口数据结构 LeapArray 来统计实时的秒级指标数据,可以很好地支撑写多于读的高并发场景。...

2022-08-11 18:06:00 2016

原创 SpringCloud学习——SpringCloud Alibaba Sentinel

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。是分布式系统的流量防卫兵。Sentinel 的主要特性:jar 包启动:。流量控制资源名:唯一名称,默认请求路径。针对来源:Sentinel可以针对调用者进行限流,填写微服务名,默认default(不区分来源)。阈值类型/单机阈值:是否集群:不需要集群。流控模式:流控效果/手段:现代微服务架构都是分布式的,由非常多的服务组成。不同服务之间相互调

2022-06-19 17:30:34 275

原创 SpringCloud学习——Histrix服务限流、降级、熔断

服务降级指的是当服务器压力剧增的情况下,为了保证核心功能的可用性 ,而选择性的降低一些功能的可用性,或者直接关闭该功能。服务降级是从整个系统的负荷情况出发和考虑的,对某些负荷会比较高的情况,为了预防某些功能(业务场景)出现负荷过载或者响应慢的情况,在其内部暂时舍弃对一些非核心的接口和数据的请求,而直接返回一个提前准备好的 fallback 兜底处理。这样,虽然提供的是一个有损的服务,但却保证了整个系统的稳定性和可用性。现代微服务架构都是分布式的,由非常多的服务组成。不同服务之间相互调用,组成复杂的调用链路。

2022-06-19 17:01:34 2263 1

原创 SpringCloud学习——配置中心

在分布式微服务系统中,几乎所有服务的运行都离不开配置文件的支持,这些配置文件通常由各个服务自行管理,以 properties 或 yml 格式保存在各个微服务的类路径下,例如 application.properties 或 application.yml 等。这种将配置文件散落在各个服务中的管理方式,存在以下问题:SpringCloud Config 为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环境提供了一个中心化的外部配置。SpringCloud Config 分

2022-06-19 16:05:36 764 1

原创 SpringCloud学习——服务网关Gateway

在微服务架构中,一个系统往往由多个微服务组成,而这些服务可能部署在不同机房、不同地区、不同域名下。这种情况下,客户端(例如浏览器、手机、软件工具等)想要直接请求这些服务,就需要知道它们具体的地址信息,例如 IP 地址、端口号等。这种客户端直接请求服务的方式存在以下问题:API 网关是一个搭建在客户端和微服务之间的服务,我们可以在 API 网关中处理一些非业务功能的逻辑,例如权限验证、监控、缓存、请求路由等。API 网关就像整个微服务系统的门面一样,是系统对外的唯一入口。有了它,客户端会先将请求发送到 API

2022-06-19 15:36:06 1271

原创 SpringCloud学习——服务调用与负载均衡(Ribbon、OpenFeign)

Spring Cloud Ribbon 是一套基于 Netflix Ribbon 实现的客户端负载均衡和服务调用工具。Ribbon 会从服务注册中心(如 Eureka Server)中获取服务端列表,然后通过某种负载均衡策略(如简单轮询、随机连接等)将请求分摊给多个服务提供者,从而达到负载均衡的目的。负载均衡(Load Balance) ,简单点说就是将用户的请求平摊分配到多个服务器上运行,以达到扩展服务器带宽、增强数据处理能力、增加吞吐量、提高网络的可用性和灵活性的目的。常见的负载均衡方式有两种:服务端负

2022-06-19 15:32:27 492

原创 SpringCloud学习——服务注册中心(Eureka、ZooKeeper、Nacos)

文章目录服务注册中心Eureka架构设计服务注册与发现的流程环境配置Eureka ServerEureka Client集群搭建Eureka 自我保护模式ZooKeeperNacosNacos 的特性基本架构服务注册与发现 Discovery服务提供者注册服务消费者注册和负载均衡Nacos 支持 AP 和 CP 模式的切换服务注册中心在微服务架构中,一个系统通常被拆分为多个模块 / 服务,此时就涉及到模块之间的服务调用问题。在服务是单实例情况下,可以采用点对点的 HTTP 直接调用,即 IP + .

2022-05-27 23:20:41 4693

原创 Zookeeper实战——分布式锁实现以及原理

文章目录Zookeeper 分布式锁实现原理具体流程代码实现客户端创建工厂类创建 Lock 锁接口Lock 实现类(ZkLock)自定义 ZK 分布式锁测试独占锁 & 共享锁Curator 实现分布式锁ZooKeeper 分布式锁的优缺点分布式锁是控制分布式系统之间同步访问共享资源的一种方式。分布式锁的实现方式有很多种,比如 Redis 、数据库 、zookeeper 等。这篇文章主要介绍用 Zookeeper 实现分布式锁。Zookeeper 分布式锁实现原理先说结论:Zookeeper.

2022-05-18 17:15:44 9215 10

原创 哈夫曼树 & 哈夫曼编码

哈夫曼树哈夫曼树的定义:设二叉树具有 n 个带权值的叶节点,那么从根节点到各个叶节点的路径长度与相应叶节点权值的乘积的和,叫作二叉树的带权路径长度 WPL (Weighted Path Length)。具有最小带权路径长度的二叉树称为哈夫曼树 (Huffman Tree),也称为最优二叉树。权值较大的结点离根较近。构造哈夫曼树的原则(贪心思想):权值越大的叶节点越靠近根节点权值越小的叶节点越远离根节点哈夫曼编码哈夫曼编码就是规定哈夫曼树中的左分支为 0,右分支为 1,从根节点到每个叶节点所经

2022-05-11 16:01:59 10235

原创 从 Reactor 模式看 Netty、Redis 线程模型

Reactor 模式目前存在的线程模型有:传统阻塞 I/O 服务模型 和 Reactor 模式。Reactor 模式是基于事件驱动开发的,核心组成部分包括 Reactor 和线程池,其中 Reactor 负责监听和分发事件,线程池负责处理事件。Reactor 分为三种模型:单线程模型 (单 Reactor 单线程)多线程模型 (单 Reactor 多线程)主从多线程模型 (多 Reactor 多线程)单 Reactor 单线程Reactor 和 Handler 都在同一个线程中执行,即 s

2022-05-07 09:56:05 1024

原创 Netty 基本概念以及核心组件

Netty 概述Netty 是一个异步事件驱动的网络应用程序框架,用于快速开发高性能、高可靠的网络 IO 程序。Netty 是基于 NIO 的,它封装了 jdk 的 NIO,让我们使用起来更加方法灵活。Netty 是一个异步的、基于事件驱动的网络应用框架,用以快速开发高性能、高可靠性的网络 IO 程序。Netty 本质是一个基于 Java NIO 的框架,适用于服务器通讯相关的多种应用场景。Netty 主要针对在 TCP 协议下,面向客户端的高并发应用,或者 Peer-to-Peer 场景下的大量

2022-05-07 08:57:41 611

原创 Netty入门实战——TCP服务、群聊系统的实现

TCP 服务Netty 服务器在 6667 端口监听,客户端上线后发送消息给服务器,服务器接收并回复消息给客户端。总的来说就是一来一回。NettyServer 服务器启动类public class NettyServer { private static final int PORT = 6667; public static void main(String[] args) { //1.创建两个线程组 BossGroup、WorkerGroup E

2022-05-03 21:05:14 1030

原创 NIO 网络编程——群聊系统实现

在使用 NIO 之前,我们先来看一下传统 BIO 阻塞 IO 的实现。Java BIO 工作机制Java BIO 就是传统的 Java I/O 编程,其相关的类和接口在 java.io。BIO(BlockingI/O):同步阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,可以通过线程池机制改善(实现多个客户连接服务器)。Java BIO 工作流程:服务器端启动一个 ServerSocket。客户端启动

2022-04-30 20:42:56 360

原创 Java NIO 基本原理以及三大核心组件

NIO 非阻塞I/OJava NIO 基本介绍Java NIO 全称 Java non-blocking IO,是指 JDK 提供的新 API。从 JDK1.4 开始,Java 提供了一系列改进的输入/输出的新特性,被统称为 NIO(即 NewIO),是同步非阻塞的。NIO 有三大核心部分:Channel(通道)、Buffer(缓冲区)、Selector(选择器) 。NIO 是面向缓冲区/块编程的。数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动,这就增加了处理过程中的灵活性,使用它可

2022-04-30 20:34:33 3340

原创 回顾我的第一次实习——少年的逐梦之旅

前记四月底了,暑期实习招聘也渐入尾声,这次春招获得的机会其实挺少的,但至少最心仪的公司都给了面试机会。可惜的是,虽然能够走到流程的最后,却还是因为各种原因与 offer 失之交臂。最终接了之前从未考虑过的公司的 offer。虽然挺可惜的,但人生还是要向前看,坚定地向未来奔跑,付出终究能获得回报。其实这次拿到的 offer 是我的第二份实习了,在去年 7 月开始,也就是大二暑假,我拿到了虎牙 Java 开发实习生的日常实习 offer,也开启了我的第一次实习之旅。现在也过去有半年了,之前一直没有写篇博客总

2022-04-26 14:43:18 346 1

原创 Redis高可用的基石——主从复制

Redis 支持主从同步,提供 Cluster 集群部署模式,通过 Sentinel 哨兵来监控 Redis 主服务器的状态。以此来保证 Redis 的高可用,则主从复制正是高可用的基石。一主多从,主负责写,并且将数据复制到其它的 slave 节点,从节点负责读。所有的读请求全部走从节点。这样也可以很轻松实现水平扩容,支撑读高并发。从节点的数据来自主节点,实现原理就是主从复制机制。主从复制过程主从复制过程大体可以分为3个阶段:连接建立阶段(即准备阶段)、数据同步阶段、命令传播阶段。连接建立阶段保

2021-12-05 19:59:38 128

原创 Redis设计与实现——对象

文章目录对象的类型与编码字符串对象编码转换列表对象编码转换哈希对象编码转换集合对象编码转换有序集合对象为什么zset同时使用跳跃表和字典来实现?编码转换Redis 的底层数据结构主要包括简单动态字符串(SDS)、双端链表、字典、跳跃表、整数集合、压缩列表。Redis 并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这个系统包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象这五种类型的对象,每一种对象类型都至少采用了两种编码,不同的编码使用的底层数据结构也不.

2021-12-05 19:37:23 901

原创 Redis设计与实现——跳跃表

跳跃表(skiplist)是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。跳跃表支持平均 O(log N) 、最坏 O(N) 复杂度的节点查找,还可以通过顺序性操作来批量处理节点。Redis 使用跳跃表作为有序集合键的底层实现之一:如果一个有序集合包含的元素数量比较多,又或者有序集合中元素的成员(member)是比较长的字符串时,Redis 就会使用跳跃表来作为有序集合键的底层实现。跳跃表的实现Redis 的跳跃表由 zskiplistNode 和 zsk

2021-11-28 21:06:36 122

原创 Redis设计与实现——字典(渐进式rehash细节)

字典是一种用于保存键值对的数据结构。在字典中,一个键(key)可以和一个值(value)进行关联(或者说将键映射为值),这些关联的键和值就称为键值对。字典的实现Redis 的字典使用哈希表作为底层实现,每个字典带有两个哈希表,一个平时使用,另一个仅在进行 rehash 过程中使用,一个哈希表里面可以有多个哈希表节点,每个哈希表节点就保存了字典中的一个键值对。哈希表 hashtableRedis 字典所使用的哈希表由 dict.h/dictht 结构定义:typedef struct dictht

2021-11-28 21:04:10 333

原创 Redis设计与实现——简单动态字符串SDS

Redis 没有直接使用 C 语言传统的字符串表示(以空字符\0结尾的char类型字符数组,以下简称 C 字符串), 而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型, 并将 SDS 用作 Redis 的默认字符串表示。在 Redis 里面, C 字符串只会作为字符串字面量(string literal), 用在一些无须对字符串值进行修改的地方,比如打印日志。SDS 的定义每个 sds.h / sdshdr 结构表示一个 SDS 值,在 Redis

2021-11-28 21:00:10 547

原创 synchronized底层原理与锁升级

文章目录使用底层原理修饰代码块修饰方法Monitor 对象Java 对象头锁升级无锁偏向锁为什么引入偏向锁?实现原理撤销偏向锁轻量级锁自旋锁重量级锁锁对比其他优化synchronized三大特性synchronized 和 volatile 的区别synchronized 关键字解决的是多个线程之间访问资源的同步性,即保证线程同步,synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。另外,在 Java 早期版本中,synchronized 属于 重量级锁,效率.

2021-11-28 20:52:02 387

原创 深入理解volatile底层原理

文章目录volatile的特性volatile实现内存可见性原理volatile实现有序性原理volatile 内存语义的实现什么是内存屏障双重检查锁下的重排序问题volatile 是轻量级的 synchronized,一般作用于变量。相比于synchronized关键字,volatile关键字的执行成本更低,因为它不会引起线程上下文的切换和调度。volatile主要有以下两个功能:保证共享变量的内存可见性(即当一个线程修改一个共享变量时,另一个线程能读到这个修改的值)。禁止指令重排序vo.

2021-11-28 20:45:12 307

原创 并发编程的艺术——Java内存模型(指令重排序、happens-before)

文章目录什么是 Java 内存模型Java 内存模型的组成部分JMM 与 Java 内存区域划分的区别与联系指令重排序指令重排序必须满足什么条件as-if-serial 语义数据依赖性happens-beforehappens-before规则(先行发生原则)什么是 Java 内存模型Java 内存模型Java Memory Model是一种抽象的概念,并不真实存在,它描述了一组规则或规范,通过这组规范定义了程序中共享变量(包括实例字段、静态字段和数组元素)的访问方式。在 Java 中,所有实例字段.

2021-11-28 20:37:05 179

原创 AQS原理与ReentrantLock源码分析

文章目录AQS 原理资源共享方式AQS 底层基于模板方法模式AQS 源码分析获取资源释放资源以 ReentrantLock 为例获取资源流程图AQS 的全称为 AbstractQueuedSynchronizer,即抽象队列同步器,这个类在java.util.concurrent.locks包下面。AQS 是一个用来构建锁和同步器的框架,使用 AQS 能简单且高效地构造出大量应用广泛的同步器,比如我们提到的 ReentrantLock,Semaphore,其他的诸如 ReentrantReadWri

2021-11-28 20:32:27 288

原创 ThreadLocal原理以及内存泄漏问题

文章目录什么是ThreadLocal?有哪些应用场景?ThreadLocal 原理ThreadLocal 内存泄漏问题为什么要将key设计成ThreadLocal的弱引用?什么是ThreadLocal?有哪些应用场景?ThreadLocal类可以让每个线程绑定自己的值,也就是拥有自己的专属本地变量。ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量,并且不会和其他线程的变量冲突,实现了线程间的数据隔离,避免了线程安全问题。ThreadLocal的应用

2021-11-27 23:26:04 1033

原创 分布式基础——几种常见的分布式锁

分布式锁在单机场景下,可以使用语言的内置锁来实现进程同步,如 synchronized、Lock等。但是在分布式场景下,需要同步的进程可能位于不同的节点上,那么就需要使用分布式锁。分布式锁:是控制分布式系统不同进程共同访问共享资源的一种锁的实现。数据库的唯一索引向表中插入一条唯一索引的记录,此时相当于加锁,释放锁时删除这条记录。唯一索引可以保证该记录只被插入一次,那么就可以用这个记录是否存在来判断是否处于锁定状态。存在以下几个问题:锁没有失效时间,解锁失败的话其它进程无法再获得该锁;只能是非

2021-11-27 23:16:07 1333

原创 分布式基础——CAP理论与BASE理论

本文内容整理自:https://blog.csdn.net/qq_34337272/article/details/80444032,并附上自己的理解CAP理论简介CAP 也就是 Consistency(一致性)、Availability(可用性)、Partition Tolerance(分区容错性) 这三个单词首字母组合。在理论计算机科学中,CAP 定理(CAP theorem)指出对于一个分布式系统来说,当设计读写操作时,只能同时满足以下三点中的两个:一致性(Consistency) .

2021-11-27 22:57:37 330

原创 SpringBoot实现MySQL读写分离

在高并发下,需要对应用进行读写分离,配置多数据源,即写操作走主库,读操作则走从库,主从数据库负责各自的读和写,缓解了锁的争用,提高了读取性能。实现读写分离有多种方式,如使用中间件MyCat、Sharding-JDBC等,这里我们使用Aop的方式在代码层面实现读写分离。实现原理实现读写分离,首先要对Mysql做主从复制,即搭建一个主数据库,以及一个或多个从数据库。具体实现主从复制,可参照前一篇博客《基于docker配置MySQL主从复制》使用Aop的方式,当调用业务层方法前,判断请求是否是只读操作

2021-11-26 22:48:41 6311 24

原创 基于docker配置MySQL主从复制

主从复制工作原理主从复制是MySQL提供的一种高可用高性能的解决方案。工作原理分为以下3个步骤:1、主库(master)把数据更改记录到**二进制日志(binlog)**中。2、从库(slave)的I/O线程把主库的二进制日志读取保存到自己的**中继日志(relay log)**中。3、从库的SQL线程执行中继日志,重做中继日志中的日志,即再执行一遍SQL,更新自己的数据库,以达到数据的一致性。注意要点:主从复制不是完全实时地进行同步,而是异步实时。从库同步主库数据的过程是串行化的,也就是

2021-11-26 22:41:04 1253 4

原创 Java线程池实现原理与ThreadPoolExector详解

线程池(Thread Pool)是一种基于池化思想管理线程的工具。为什么要使用线程池?降低资源消耗:通过池化技术重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度:当任务到达时,任务可以不需要等到线程创建就能立即执行。提高线程的可管理性:线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会因为线程的不合理分布导致资源调度失衡,降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。提供更多更强大的功能:线程池具备可拓展性,允许开发人员向其中增加更多的功能。比如延时定时线程池S

2021-11-23 23:54:40 727

原创 Java中的阻塞队列BlockingQueue

阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除方法。支持阻塞的插入方法:当队列满时,队列会阻塞插入元素的线程,直到队列不满,如 put() 方法。支持阻塞的移除方法:在队列为空时,获取元素的线程会等待队列变为非空,如 take() 方法。BlockingQueue 常用于生产者-消费者场景,生产者是往队列里添加元素的线程,消费者是从队列里取元素的线程。BlockingQueue就是存放元素的容器。阻塞队列提供了四组不同的方法用于插入、移除

2021-11-22 23:36:44 526

原创 查找算法——二分查找与插值查找

二分查找使用二分查找的场景:数组有序非递归版public static int binarySearch(int[] nums, int target) { int left = 0, right = nums.length - 1; while (left < right) { int mid = left + (right - left) / 2; //防止溢出 if (nums[mid] == target) {

2021-11-10 23:43:46 148

原创 源码分析Arrays-sort中使用的排序算法

Arrays.sort底层Java 主要排序方法为 java.util.Arrays.sort(),粗略的来讲,对于原始数据类型使用双轴快速,对于引用类型使用归并排序。一开始会判断数组是否是小数组(元素小于286),是则使用快速排序。static void sort(int[] a, int left, int right, int[] work, int workBase, int workLen) { // Use Quicksort on small a

2021-11-10 23:41:28 740

原创 十大排序算法(快速排序、归并排序、堆排序、直接插入排序)——Java实现

文章目录冒泡排序选择排序直接插入排序希尔排序归并排序快速排序堆排序计数排序比较和非比较的区别桶排序基数排序基数排序 vs 计数排序 vs 桶排序总结冒泡排序从要排序序列的第一个元素开始,不断比较相邻元素的值,发现逆序则交换,将值较大的元素逐渐从前向后移动。每找到待排序序列的最大值时,就将该最大值固定在待排序序列的尾部,且每找到一个待排序序列最大值需要循环一次,n 个值则需要循环 n 次,但最后一个值无需比较,则实际需循环 n-1 次,即 i < arr.length - 1 。publi

2021-11-10 23:39:43 1104

原创 C语言——常见排序算法与查找算法

数据结构typedef int ElemType;typedef struct{ ElemType *elem; //顺序表基址,elem[0]闲置或作为监视哨 int length; //顺序表长度}SqList;

2021-11-09 18:53:56 1692

jquery+bootstrap+layui前端框架三件套

包含jquery-1.9.1和bootstrap-3.3.7和layui-v2.5.6三个前端框架,这三个都是前端开发常用的强大框架

2020-08-03

kv_server.py

使用python实现简单的基于TCP协议的服务端,配合客户端,允许你一句我一句进行通信。ip地址可根据具体情况自行修改。

2020-02-09

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除