多多在线免费观看电视剧/aso安卓优化公司
个人主页:C++忠实粉丝
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C++忠实粉丝 原创排序之插入排序----直接插入排序和希尔排序(1)
收录于专栏【数据结构初阶】
本专栏旨在分享学习数据结构学习的一点学习笔记,欢迎大家在评论区交流讨论💌
目录
1.排序的概念及其运用
1.1排序的概念
1.2排序运用
1.2.1 购物和电商
1.2.2 图书馆和书店
1.2.3 教育
1.2.4 交通和物流
1.2.5 餐饮业
1.3 常见的排序算法
2.插入排序
2.1基本思想
2.2直接插入排序
2.2.1直接插入排序的概念:
2.2.2直接插入排序示例:
2.2.3动图演示:
2.2.4代码实现:
2.2.5测试代码:
2.2.6时间复杂度分析
2.3希尔排序 ( 缩小增量排序 )
2.3.1希尔排序的概念
2.3.2希尔排序图解分析:
2.3.3代码展示:
2.3.4测试代码:
2.3.5希尔排序时间复杂分析:
2.3.6 希尔排序的特性总结:
2.4希尔排序与直接插入排序的关系和比较
3总结
1.排序的概念及其运用
1.1排序的概念
排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。
稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次 序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排 序算法是稳定的;否则称为不稳定的。
内部排序:数据元素全部放在内存中的排序。
外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不断地在内外存之间移动数据的排序。
1.2排序运用
排序算法在生活中有着广泛的应用,无论是日常活动还是专业领域,都能看到排序算法的身影。以下是一些具体的例子:
1.2.1 购物和电商
- 产品排列:在线购物平台会根据价格、销量、评价等对商品进行排序,方便用户查找和比较。
- 推荐系统:根据用户的浏览和购买历史,推荐系统会对可能感兴趣的商品进行排序。
1.2.2 图书馆和书店
- 分类与索引:图书按字母顺序、类别、作者或者出版日期排序,方便读者查找。
- 借阅记录:按时间顺序记录借还书信息,便于管理和统计。
1.2.3 教育
- 成绩排名:考试成绩会按照分数排序,以便评估学生的表现。
- 学籍管理:按学号或姓名排序学生信息,便于查询和管理。
1.2.4 交通和物流
- 航班和列车时刻表:按出发时间、目的地等排序,方便乘客查询和安排行程。
- 快递分拣:按目的地、优先级等对包裹进行排序,提高运送效率。
1.2.5 餐饮业
- 菜单排序:餐厅菜单按菜品类型、受欢迎程度等排序,方便顾客选择。
- 订单处理:按下单时间、优先级等排序订单,确保及时准确地完成服务。
这些例子展示了排序算法在各种场景中的重要性和广泛应用,从而提高了效率和用户体验。无论是简单的字母排序还是复杂的多条件排序,排序算法在现代生活中都是不可或缺的工具。
1.3 常见的排序算法
大家可以去下面链接查看各个排序算法的动态演示效果
--Comparison Sorting Visualization (usfca.edu)
2.插入排序
2.1基本思想
直接插入排序是一种简单的插入排序法,其基本思想是: 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。
实际中我们玩扑克牌时,就用了插入排序的思想
2.2直接插入排序
2.2.1直接插入排序的概念:
直接插入排序(Insertion Sort)是一种简单直观的排序算法,其基本思想是逐步构建有序序列。具体操作如下:
初始状态:将序列分为两部分,一部分是有序序列,初始时只包含第一个元素;另一部分是无序序列,包含剩余的元素。
排序过程:
- 从第二个元素开始,依次将该元素插入到前面已经排好序的序列中的合适位置。
- 假设当前要插入的元素为
current_value
,将current_value
与已排序序列中的元素从后向前逐个比较。- 如果发现已排序元素比
current_value
大,则将该元素后移一位,直到找到比current_value
小的位置,或者到达序列的开头。- 将
current_value
插入到找到的位置后,此时已排序序列长度增加一。重复:重复以上步骤,直到所有元素都插入到有序序列中。
结束:当所有元素都插入到有序序列后,排序完成。
2.2.2直接插入排序示例:
假设要对数组 [5, 2, 4, 6, 1, 3]
进行直接插入排序:
- 初始时,有序序列为
[5]
,无序序列为[2, 4, 6, 1, 3]
。 - 将
2
插入到[5]
中,得到[2, 5]
,无序序列变为[4, 6, 1, 3]
。 - 将
4
插入到[2, 5]
中,得到[2, 4, 5]
,无序序列变为[6, 1, 3]
。 - 依此类推,直到所有元素都插入到有序序列中,最终得到排序后的数组
[1, 2, 3, 4, 5, 6]
。
直接插入排序虽然简单,但在某些特定情况下仍然可以提供不错的性能,特别是在处理部分有序的数据或者数据量较小时。
2.2.3动图演示:
2.2.4代码实现:
void InsertSort(int* a, int n)
{// [0, n-1]for (int i = 0; i < n - 1; i++){// [0, n-2]是最后一组// [0,end]有序 end+1位置的值插入[0,end],保持有序int end = i;int tmp = a[end + 1];while (end >= 0){if (tmp < a[end]){a[end + 1] = a[end];--end;}else{break;}}a[end + 1] = tmp;}
}
分析:
外层循环(i 循环):
for (int i = 0; i < n - 1; i++)
循环遍历数组,从第一个元素到倒数第二个元素。每次迭代开始时,数组从a[0]
到a[i]
是已经排好序的部分。内层循环(end 循环):
int end = i;
将当前元素a[i+1]
视为待插入的元素。int tmp = a[end + 1];
记录待插入元素的值。插入过程:
while (end >= 0)
内层循环用于找到待插入元素tmp
的正确位置。if (tmp < a[end])
如果待插入元素比当前位置a[end]
的元素小,则将a[end]
向后移动一位,即a[end + 1] = a[end];
,同时end--
继续向前比较。- 当找到合适的位置(即
tmp >= a[end]
),退出内层循环。插入操作:
a[end + 1] = tmp;
将tmp
插入到找到的合适位置end + 1
处,此时数组从a[0]
到a[i+1]
又变成有序状态。注意:我们的外层循环
for (int i = 0; i < n - 1; i++)
是遍历的是我们已经排好序的数组,我们需要排的数为a[end+1],也就是a[i+1],所以这里i<n-1,不能等于n-1
2.2.5测试代码:
测试链接:912. 排序数组 - 力扣(LeetCode)
题目描述:
给你一个整数数组 nums
,请你将该数组升序排列。
示例 1:
输入:nums = [5,2,3,1] 输出:[1,2,3,5]
示例 2:
输入:nums = [5,1,1,2,0,0] 输出:[0,0,1,1,2,5]
提示:
1 <= nums.length <= 5 * 104
-5 * 104 <= nums[i] <= 5 * 104
代码展示:
void InsertSort(int* a, int n)
{for(int i = 0; i < n-1; i++){int end = i;int tmp = a[end + 1];while(end >= 0){if(a[end] > tmp){a[end + 1] = a[end];end--;}else{break;}}a[end + 1] = tmp;}
}int* sortArray(int* nums, int numsSize, int* returnSize) {(*returnSize) = numsSize;int* array = (int*)malloc(sizeof(int)*(*returnSize));for(int i = 0; i < numsSize; i++){array[i] = nums[i];}InsertSort(array, numsSize);return array;
}
2.2.6时间复杂度分析
插入排序可以说是排序的最底层,它最好的情况是有序,时间复杂度为O(n),很显然这种情况很少见,最坏的情况是逆序,时间复杂度为O(n^2).在平均情况下,直接插入排序的时间复杂度也是 O(n^2)。虽然有时候可能会比较少于最坏情况下的比较次数,但是对于大规模的随机数组,其平均时间复杂度仍然是二次阶的。
在力扣这道题目中只通过了12个例子就超时了.....
直接插入排序的特性总结:
1. 元素集合越接近有序,直接插入排序算法的时间效率越高
2. 时间复杂度:O(N^2)
3. 空间复杂度:O(1),它是一种稳定的排序算法
4. 稳定性:稳定
2.3希尔排序 ( 缩小增量排序 )
2.3.1希尔排序的概念
希尔排序(Shell Sort)是一种改进的插入排序算法,也称作缩小增量排序。希尔排序通过将原始序列分割成若干个子序列来改善插入排序的性能,每个子序列分别进行插入排序,最后再对整体进行一次插入排序。其基本思想可以描述如下:
步骤:
- 选择一个增量序列,通常是使用 Knuth 序列(例如 ( n / 2, n / 4, ..., 1 ))或者 Hibbard 序列(( 2^k - 1 ))来作为增量。
- 根据选定的增量序列,将待排序的序列分割成若干个子序列。
- 对每个子序列分别进行插入排序。
- 逐渐缩小增量,重复以上步骤,直到增量为 1。
排序过程:
- 假设待排序数组为
[5, 2, 4, 6, 1, 3]
。- 如果选取增量序列为 ( n / 2, n / 4, ..., 1 ),则初始增量 ( n / 2 = 3 )。
- 分别对
[5, 6]
、[2, 1]
、[4, 3]
这三个子序列进行插入排序。- 第一次插入排序后,可能得到
[1, 2, 3, 5, 4, 6]
。- 接下来使用更小的增量进行插入排序,直到最终使用增量为 1 的插入排序完成整体排序。
2.3.2希尔排序图解分析:
2.3.3代码展示:
void ShellSort(int* a, int n)
{int gap = n;while (gap > 1){// +1保证最后一个gap一定是1// gap > 1时是预排序// gap == 1时是插入排序gap = gap / 3 + 1;for (size_t i = 0; i < n - gap; ++i){int end = i;int tmp = a[end + gap];while (end >= 0){if (tmp < a[end]){a[end + gap] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;}}
}
代码逻辑:
初始设置 gap:
- 初始时,将 gap 设置为数组长度 n。在每一轮迭代中,通过
gap = gap / 3 + 1
逐渐减小 gap 的值,直到最后一次迭代时 gap 等于 1,变成普通的插入排序。主循环(while 循环):
- 当 gap 大于 1 时,进行希尔排序的预处理阶段,即根据当前的 gap 进行分组预排序。
- 当 gap 等于 1 时,执行最后一轮,此时相当于执行普通的插入排序。
预排序阶段:
- 对于每个 gap 值,通过一个 for 循环遍历数组,对每个分组进行插入排序。这里的
for (size_t i = 0; i < n - gap; ++i)
控制每个分组的起始位置。插入排序:
- 对于当前的分组起始位置 i,使用插入排序的方式将该分组内的元素排序。
- 内部的 while 循环用于找到合适的插入位置,确保当前位置的元素插入到正确的位置。
交换和移动:
- 如果当前位置的元素比 tmp(待插入元素)大,则将当前位置的元素向后移动 gap 个位置,直到找到合适的插入位置。
- 插入位置确定后,将 tmp 插入到该位置。
最终结果:
- 经过多次循环和逐步缩小的 gap 值处理后,数组 a 将被排序完成。
2.3.4测试代码:
测试链接:912. 排序数组 - 力扣(LeetCode)
代码展示:
void ShellSort(int* a, int n)
{int gap = n;while(gap > 1){gap = gap/3 + 1;for(int i = 0; i < n - gap; i++){int end = i;int tmp = a[end + gap];while(end >= 0){if(tmp < a[end]){a[end + gap] = a[end];end-=gap;}else{break;}}a[end + gap] = tmp;}}
}int* sortArray(int* nums, int numsSize, int* returnSize) {(*returnSize) = numsSize;int* array = (int*)malloc(sizeof(int)*(*returnSize));for(int i = 0; i < numsSize; i++){array[i] = nums[i];}ShellSort(array, numsSize);return array;
}
结果展示:
居然过了!!!!!!!!!!
希尔排序虽然有点难理解,看起来很复杂,但是它的效率真的很高.
2.3.5希尔排序时间复杂分析:
有关希尔排序的时间复杂度至今都没有定论.
《数据结构(C语言版)》--- 严蔚敏
《数据结构-用面相对象方法与C++描述》--- 殷人昆
因为我的gap是按照Knuth提出的方式取值的,而且Knuth进行了大量的试验统计,我们暂时就按照:O(n^1.3)来算
那为什么希尔排序的时间复杂难算呢?
第一次预排序 gap = n/3(这里我们将-1省略方便计算),一组有3个数据(n=10),最坏的情况需要排3次,也就是3*3/n=n,也就是说,希尔第一次预排序接近于O(n)
最后一次排序:数组接近有序,可以看成O(n)
第二次预排序:gap=n/9,每组九个数据,最坏的情况(1+2.....+8)*n/9=4n
注意:这里我们第二次预排序取得是最坏的情况,而经过我们第一次得预排序,我们第二次往往不会是最坏的情况,希尔排序难就难在除第一次和最后一次,其他情况是变化的
2.3.6 希尔排序的特性总结:
1. 希尔排序是对直接插入排序的优化。
2. 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就 会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。
3. 希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算,因此在好些树中给出的 希尔排序的时间复杂度都不固定:
2.4希尔排序与直接插入排序的关系和比较
关系与比较:
基础原理: 希尔排序可以看作是对直接插入排序的改进,通过预处理数据,使其更接近最终排序后的位置,从而减少了直接插入排序中的元素比较和移动次数。
性能比较: 在数据量较小时,直接插入排序可能会比希尔排序更快,因为希尔排序的预处理阶段可能带来一定的额外开销。但是在大规模数据和随机数据排序时,希尔排序通常能够明显优于直接插入排序。
稳定性: 直接插入排序是稳定的,而希尔排序一般来说是不稳定的,这是因为希尔排序涉及多个子序列的插入排序,子序列之间的相对顺序可能发生变化。
综上所述,希尔排序和直接插入排序虽然在实现上有所区别,但它们的基本思想都是通过逐步将元素移动到正确位置来完成排序,希尔排序通过增量序列的方式优化了插入排序的性能,特别是在处理大规模数据时表现更为优越。
3总结
直接插入排序和希尔排序虽然在我们排序中使用较少,但它们具有可使用性,尤其是希尔排序(从它AC力扣的数组排序就可以看出)
我马上会更选择排序--(选择排序和推排序)
宝子们记得点赞关注支持一下
我将会在数据结构初阶这个专栏持续更新
相关文章:

排序之插入排序----直接插入排序和希尔排序(1)
个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 排序之插入排序----直接插入排序和希尔排序(1) 收录于专栏【数据结构初阶】 本专栏旨在分享学习数据结构学习的一点学习笔记,欢迎大家在评论区交流讨…...

快速创建条形热力图
Excel中的条件格式可以有效的凸显数据特征,如下图中B列所示。 现在需要使用图表展现热力条形图,如下图所示。由于颜色有多个过渡色,因此手工逐个设置数据条的颜色,基本上是不可能完成的任务,使用VBA代码可以快速创建这…...

go switch 与 interface
go switch 与 interface 前言 前言 github.com/google/cel-go/common/types/ref type Val interface {// ConvertToNative converts the Value to a native Go struct according to the// reflected type description, or error if the conversion is not feasible.ConvertTo…...

BaseMapper 接口介绍
基于 mybatis-mapper/provider 核心部分实现的基础的增删改查操作,提供了一个核心的 io.mybatis.mapper.BaseMapper 接口和一个 预定义 的 io.mybatis.mapper.Mapper 接口,BaseMapper 接口定义如下: /*** 基础 Mapper 方法,可以在…...

HAL-Cubemax定时器使用记录
title: HAL-Cubemax定时器使用记录 tags: STM32HalCubemax 文章目录 HAL-Cubemax定时器使用记录分享一种思路1.创建一个ms(毫秒)级延时中断2.创建计数的变量3.在需要延时的函数中对变量阈值进行判断4.验证实例--完整使用记录代码 问题往期内容基础库HAL cubemax VSCODE GCC …...

同时使用磁吸充电器和Lightning时,iPhone充电速度会变快吗?
在智能手机的世界里,续航能力一直是用户关注的焦点。苹果公司以其创新的MagSafe技术和传统的Lightning接口,为iPhone用户提供了多样化的充电解决方案。 然而,当这两种技术同时使用时,它们能否带来更快的充电速度?本文…...

零成本搭建个人图床服务器
前言 图床服务器是一种用于存储和管理图片的服务器,可以给我们提供将图片上传后能外部访问浏览的服务。这样我们在写文章时插入的说明图片,就可以集中放到图床里,既方便多平台文章发布,又能统一管理和备份。 当然下面通过在 Git…...

SpringBoot 搭建sftp服务 实现远程上传和下载文件
maven依赖: <dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifactId><version>0.1.55</version> </dependency>application.yml sftp:protocol: sftphost: port: 22username: rootpassword: sp…...

IDEA中使用leetcode 刷题
目录 1.IDEA下载leetcode插件 2.侧边点开插件 3.打开网页版登录找到cookie复制 4.回到IDEA登录 5.刷题 6.共勉 1.IDEA下载leetcode插件 2.侧边点开插件 3.打开网页版登录找到cookie复制 4.回到IDEA登录 5.刷题 6.共勉 算法题来了不畏惧, 挑战前行是成长的舞台…...

华为海思CPU解读
安全可靠CPU测评结果(华为海思篇) 中国信息安全测评中心于2024年5月20日发布安全可靠测评结果公告(2024年第1号),公布依据《安全可靠测评工作指南(试行)》的测评结果,自发布起有效期…...

中介子方程三十三
XXFXXuXXWXXuXXdXXrXXαXXuXpXXdXXpXuXXαXXrXXdXXuXWXπXXWXeXyXeXbXπXpXXNXXqXeXXrXXαXXuXpXXdXXpXuXXαXXrXXeXqXXNXXpXπXbXeXyXeXWXXπXWXuXXdXXrXXαXXuXpXXdXXpXuXXαXXrXXdXXuXXWXXuXXFXXEXXyXXEXXrXXαXXuXpXXdXXpXuXXαXXrXXEXXyXXαXiXXαXiXrXkXtXyXXpXVXXdXuXWX…...

今年哪两个行业可能有贝塔?
银行和综合板块存在比较明显的行业贝塔,背后原因是:银行板块中,最小的几家银行市值也不小;综合板块中,最大的几家市值也不大。 一、今年哪两个行业可能有贝塔? 我们一直强调今年市场呈现出【行业弱beta、风…...

嵌入式软件开发工具使用介绍
软件开发工具 辅助开发工具 硬件工具与仪器设备 逻辑分析仪使用 串口数据解码分析 示波器使用 1.示波器简介 TBS 1052B(Tektronix)系列数字存储示波器在紧凑的设计中提供了经济的性能。 由于多种标配功能, 包括 USB 连接、34 种自动测量、…...

【TB作品】MSP430G2553,单片机,口袋板, 交通灯控制系统
题8 交通灯控制系统 十字路口交通灯由红、绿两色LED显示器(两位8段LED显示器)组成,LED显示器显示切换倒计时,以秒为单位,每秒更新一次;为确保安全,绿LED计数到0转红,经5秒延时&#…...

windows 安装 Kubernetes(k8s)
windows 安装 docker 详情见: https://blog.csdn.net/sinat_32502451/article/details/133026301 minikube Minikube 是一种轻量级的Kubernetes 实现,可在本地计算机上创建VM 并部署仅包含一个节点的简单集群。 下载地址:https://github.…...

C语言 | Leetcode C语言题解之第189题轮转数组
题目: 题解: void swap(int* a, int* b) {int t *a;*a *b, *b t; }void reverse(int* nums, int start, int end) {while (start < end) {swap(&nums[start], &nums[end]);start 1;end - 1;} }void rotate(int* nums, int numsSize, int…...

【安全审核】音视频审核开通以及计费相关
融云控制台音视频审核入口:音视频审核 1 音视频审核文档:融云开发者文档 1 提示: 开发环境: 免费体验 7 天(含 21 万分钟音频流和 420 万张视频审核用量),免费额度用尽后,将关停服务…...

【实战】Spring Cloud Stream 3.1+整合Kafka
文章目录 前言新版版本优势实战演示增加maven依赖增加applicaiton.yaml配置新增Kafka通道消费者新增发送消息的接口 实战测试postman发送一个正常的消息postman发送异常消息 前言 之前我们已经整合过Spring Cloud Stream 3.0版本与Kafka、RabbitMQ中间件,简直不要太…...

java之可变字符串之append方法
可变字符串如果要添加内容,需要用到append方法 语法格式如下 sbf.append(obj) 其中sbf是任意的可变字符串 obj是任意数据类型的对象 这个方法是将任意数据转换成字符串,然后添加到此序列中 public class Buffer {public static void main(String[]…...

[保姆级教程]uniapp自定义导航栏
文章目录 导文隐藏默认导航栏:全局隐藏当前页面隐藏 添加自定义导航栏视图:手写导航栏组件导航栏 导文 在 UniApp 中,自定义导航栏通常涉及到隐藏默认的导航栏,并在页面顶部添加自定义的视图组件来模拟导航栏的功能。 隐藏默认导航…...

项目训练营第二天
项目训练营第二天 用户登录逻辑 1、账户名不少于4位 2、密码不少于8位 3、数据库表中能够查询到账户、密码 4、密码查询时用同样加密脱敏处理手段处理后再和数据库中取出字段进行对比,如果账户名未查询到,直接返回null 5、后端设置相应的脱敏后用户的s…...

考研数学一有多难?130+背后的残酷真相
考研数学一很难 大家平时在网上上看到很多人说自己考了130,其实这些人只占参加考研数学人数的极少部分,有个数据可以展示出来考研数学到底有多难: 在几百万考研大军中,能考到120分以上的考生只有2%。绝大多数人的分数集中在30到…...

vue2脚手架笔记总结1
1.什么是组件 组件是实现局部代码和功能资源的集合 2.vue.config.js配置文件 使用vue inspect > output.js可以查看到Vue脚手架的默认配置,但是在这里面修改不会影响实际的配置,如果需要修改配置需要使用用vue.config.js文件,详情见:https://cli.vuej…...

校园巡礼:一周只上四天课,入学即发钱?深圳理工大学,开局即王炸
校园巡礼 | 一周只上四天课,入学即发钱?深圳理工大学,开局即王炸! 会议之眼 快讯 目前各省的高考成绩现已陆续揭晓,广东省教育考试院发布了2024年高考录取最低分数线,物理类本科线为442分,历史…...

免交互 实验
免交互 交互:我们发出指令控制程序的运行,程序在接收到指令之后按照指令的效果做出对应的反应。 免交互:间接的,通过第三方的方式把指令传送给程序,不用直接下达指令。 Here document 免交互 这是命令行格式&#…...

Sublime Text 设置
备份 {"font_size": 10,"index_files": true,"font_face": "Courier New","vintage_start_in_command_mode": false,"ignored_packages": ["Vintage"],"word_wrap": "false" }关闭…...

spire.Pdf 将pdf转成image
一、nuget安装 <ItemGroup><PackageReference Include"Spire.PDF" Version"10.6.7" /></ItemGroup> 二、直接上代码 using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using System; using System.IO;namespace …...

仓颉编程语言 -- 初识(一)
官网 文档 原生智能化 内嵌AgentDSL的编程框架,自然语言&编程语言有机融合;多Agent协同,简化符号表达,模式自由组合,支持各类智能应用开发。 天生全场景 轻量化可缩放运行时,模块化分层设计…...

前端JS必用工具【js-tool-big-box】学习,数值型数组的正向排序和倒向排序
这一小节,我们说一下前端 js-tool-big-box 这个工具库,添加的数值型数组的正向排序和倒向排序。 以前呢,我们的数组需要排序的时候,都是在项目的utils目录里,写一段公共方法,弄个冒泡排序啦,弄…...

python web框架哪家强?Flask、Django、FastAPI对比
前言 当你掌握了python的基础知识,并且会用和HTML和CSS编写简单的静态网页。现在你只需再掌握一个python web框架的知识,就可以开始编写一个动态的网站了。目前市面比较流程的python web框架有三个flask、Django、FastAPI。接下来我们对比一下。他们三个…...