数据结构与算法基础-学习-32-选择排序之简单选择排序、堆排序

news2025/1/21 12:14:01

目录

一、简单选择排序基本思路

二、简单选择排序基本操作

三、简单选择排序算法思路

四、简单选择排序代码

1、SimpleSelectSortSentrySqQueue

五、简单选择排序算法分析

1、记录移动次数

2、记录比较次数

六、简单选择排序Linux环境编译测试

七、堆的定义

八、堆调整

1、小根堆

2、大根堆

九、堆排序的算法思路

1、调整为大根堆

2、堆调整为升序序列

十、堆排序代码

1、HeapSiftSentrySqQueue

2、HeapSortSentrySqQueue

十一、堆排序算法分析

1、最大优点

2、辅助存储空间

3、适用情况

十二、堆排序Linux环境编译测试


排序的其他相关知识点和源码分享可以参考之前的博客:   

《数据结构与算法基础-学习-30-插入排序之直接插入排序、二分插入排序、希尔排序》,

《数据结构与算法基础-学习-31-交换排序之冒泡排序、快速排序》

一、简单选择排序基本思路

在待排序的数据中选出最大(小)的元素放在其最终的位置。

二、简单选择排序基本操作

1、首先通过n-1次关键字比较,从n个记录中找出关键字最小的记录,将它与第一个记录交换。

2、再通过n-2次比较,从剩余的n-1个记录中找出关键字次小的记录,将它与第二个记录交换。

3、重复上述操作,共进行n-1趟排序后,排序结束。

三、简单选择排序算法思路

我们还是以这个图为例来进行介绍,升序排列。Min指向最小值的索引号,i表示最小值需要插入的位置,j表示需要比较的元素。

先将1号位的3移动到哨兵位,存储最小值的实际值,Min初始化为1号位,j从Min加一的位置开始扫描。

发现j的2比哨兵的3小,将哨兵位放上2,Min记录最小索引2,j继续向后扫描。

发现j的8比哨兵的2大,j继续向后扫描。

发现j的5比哨兵的2大,j继续向后扫描。

发现j的4比哨兵的2大,j继续向后扫描。

发现j的6比哨兵的2大,j继续向后扫描。

发现j的1比哨兵的2小,将哨兵位放上1,Min记录最小索引7,所有元素已经扫描一遍,已经找到最小值。

将Min和i索引所存储的元素交换,这就得到最小值1了,1号位不需要再扫描了,i继续右移,Min还是以需要扫描的第一个元素为最小值设为2,j初始化为i加1等于3。

快进一下,不然画的图太多了,8,5,4,6,3都比2大,所以只需要右移j。

2号位不需要再扫描了,i继续右移,Min还是以需要扫描的第一个元素为最小值设为3,j初始化为i加1等于4,j开始右移。

发现j的5比哨兵的8小,将哨兵位放上5,Min记录最小索引4,j继续向后扫描。

发现j的4比哨兵的5小,将哨兵位放上4,Min记录最小索引5,j继续向后扫描。

发现j的6比哨兵的4大,j继续向后扫描。

发现j的3比哨兵的4小,将哨兵位放上3,Min记录最小索引7,所有元素已经扫描一遍,已经找到最小值。

3号位不需要再扫描了,i继续右移,Min还是以需要扫描的第一个元素为最小值设为4,j初始化为i加1等于5,j开始右移。

发现j的4比哨兵的5小,将哨兵位放上4,Min记录最小索引5,j继续向后扫描。

发现6,8比哨兵的4大,所有元素已经扫描一遍,已经找到最小值。

虽然数据到这里已经有序了,但其实后面还需要按照前面的逻辑再把数据扫描一遍。

四、简单选择排序代码

1、SimpleSelectSortSentrySqQueue

Status SimpleSelectSortSentrySqQueue(SqQueue* Queue)
{
    JudgeAllNullPointer(Queue);

    if (Queue->Flag != INT_TYPE_FLAG)
    {
        return FailFlag;
    }
    
    QueueLenType i;
    QueueLenType j;
    int*         Array    = (int*)(Queue->Data);
    QueueLenType MinIndex;

    for (i = 1; i < Queue->SqQueueLen - 1; i++)//n个元素需要n-1趟,才能全部排列好。
    {
        MinIndex = i;
        Array[0] = Array[i];
        for (j = i + 1; j < Queue->SqQueueLen; j++)//排好序的元素不需要再进行比较。
        {
            if (Array[j] < Array[0])//寻找最小值
            {
                Array[0] = Array[j];
                MinIndex = j;
            }
        }
        if (i != MinIndex)//判断是否交换
        {
            Array[MinIndex] = Array[i];
            Array[i]        = Array[0];
        }
    }
    
    LogFormat(Debug,"Simple Select Sort SqQueue OK.\n");

    return SuccessFlag;
}

五、简单选择排序算法分析

情况时间复杂度是否稳定
最好O(n^2)不稳定
最坏O(n^2)
平均O(n^2)

1、记录移动次数

最坏是怎么算出来的呢,n个元素最多只用移动n-1次,数据存放到哨兵一次,最小值的位置和最小值需要移动到的正确位置进行交换需要两次,一共三次,所以是3(n - 1)。

情况次数
最好0
最坏3(n - 1)

2、记录比较次数

无论待排序列处于上面状态,选择排序所需进行的比较次数都相同。

n个元素需要比较n-1次可以找出最大或最小值。

找到的元素不用再比较,n-1个元素需要比较n-2次可以找出最大或最小值。

也就是一共需要比较

n-1 + n-2 + n-3 + ... + 1 = (n-1 + 1) * (n-1) / 2 = (n - 1) * n / 2。 

六、简单选择排序Linux环境编译测试

[gbase@czg2 Sort]$ make
gcc -Wall -Wextra -O3 InsertSort.c SwapSort.c SelectSort.c MergeSort.c BucketSort.c main.c -o TestSort -I /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/Log/ -I /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/ -I /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/HashTable/include/ -I /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/SqQueue/ -I /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/SqStack/ -L /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/Make/Libs/ -lPublicFunction -lLog -lSqQueue
[gbase@czg2 Sort]$ ./TestSort 
2023-9-8--[ Info  ]--SqQueue Data   :
Data           : [ 0 ,50 ,51 ,52 ,53 ,54 ,55 ,56 ,57 ,58 ,59 ,60 ,61 ,62 ,63 ,64 ,65 ,66 ,67 ,68 ,69 ,70 ,71 ,72 ,73 ,74 ,75 ,76 ,77 ,78 ,79 ,80 ,81 ,82 ,83 ,84 ,85 ,86 ,87 ,88 ,89 ,90 ,91 ,92 ,93 ,94 ,95 ,96 ,97 ,98 ,99 ,0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10 ,11 ,12 ,13 ,14 ,15 ,16 ,17 ,18 ,19 ,20 ,21 ,22 ,23 ,24 ,25 ,26 ,27 ,28 ,29 ,30 ,31 ,32 ,33 ,34 ,35 ,36 ,37 ,38 ,39 ,40 ,41 ,42 ,43 ,44 ,45 ,46 ,47 ,48 ,49 ]
FrontIndex     : 0
RearIndex      : 0
SqQueueLen     : 101
SqQueueMaxLen  : 101
Flag           : INT_TYPE_FLAG
2023-9-8--[ Info  ]--Sort Function Elapsed Time   : 0 s
2023-9-8--[ Info  ]--SqQueue Data   :
Data           : [ 98 ,0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10 ,11 ,12 ,13 ,14 ,15 ,16 ,17 ,18 ,19 ,20 ,21 ,22 ,23 ,24 ,25 ,26 ,27 ,28 ,29 ,30 ,31 ,32 ,33 ,34 ,35 ,36 ,37 ,38 ,39 ,40 ,41 ,42 ,43 ,44 ,45 ,46 ,47 ,48 ,49 ,50 ,51 ,52 ,53 ,54 ,55 ,56 ,57 ,58 ,59 ,60 ,61 ,62 ,63 ,64 ,65 ,66 ,67 ,68 ,69 ,70 ,71 ,72 ,73 ,74 ,75 ,76 ,77 ,78 ,79 ,80 ,81 ,82 ,83 ,84 ,85 ,86 ,87 ,88 ,89 ,90 ,91 ,92 ,93 ,94 ,95 ,96 ,97 ,98 ,99 ]
FrontIndex     : 0
RearIndex      : 0
SqQueueLen     : 101
SqQueueMaxLen  : 101
Flag           : INT_TYPE_FLAG

七、堆的定义

若有n个元素的序列{a1,a2,...,an}满足(ai <= a2i 和 ai <= a2i+1)或(ai >= a2i 和 ai >= a2i+1),则分别称为该序列为小根堆和大根堆。

堆的实质是满足如下性质的完全二叉树:二叉树中任一非叶子节点均小于或大于它的孩子结点。

八、堆调整

如何再输出堆顶元素后,调整剩余元素为一个新的堆?

升序为例。

1、小根堆

(1)输出堆顶元素之后,以堆中最后一个元素代替之。

(2)将根节点值与左右子树的根节点值进行比较,并于其中小者进行交换。

(3)重复上述操作,直至叶子节点,将得到新的堆,称这个从堆顶至叶子的调整过程为筛选。

2、大根堆

(1)以堆中最后一个元素代替之根节点的元素,输出堆顶元素。

(2)将根节点值与左右子树的根节点值进行比较,并于其中小者进行交换。

(3)重复上述操作,直至叶子节点,将得到新的堆,称这个从堆顶至叶子的调整过程为筛选。

九、堆排序的算法思路

推排序的实现需要两个大的步骤,一是将待排序的元素调整为大根堆或小根堆。二、堆调整为升序或降序序列。

我们这里以大根堆、升序排列为例,待排元素如下:

1、调整为大根堆

(1)我们需要想把上面的数组想象成满二叉树,如下:

(2)我们的思路是从下到上进行堆调整,需要先把这个树的子树调整为大根堆,上面的双亲结点才能调整成大根堆。

(3)5和4中的最大者5和2进行交换,那这个子树已经调整为大根堆。

(4)数组也变化了。

(5)接下来我们来调整这棵树。

(6)5和8中的最大者8和3进行交换,那这个子树已经调整为大根堆。

(7)那这整棵树就已经变成大根堆了,对应的数组也变化了。

2、堆调整为升序序列

现在我们从上到下进行排序。

(1)第一个结点和最后一个交换位置,是不是感觉出什么了,最后一个元素变为最大值了,变换位置之后这棵子树就不是大根堆了,我们来开始调整。

(2)5和3中的最大者5和4进行交换,那这个子树已经调整为大根堆。

(3)刚刚Index:2变化了,我们看一下这颗子树是否需要调整,发现就是大根堆,可以不调整,欧耶,Index:5不需要调整记得哈。

(4)实际数组变化如下

(5)第一个结点和最后一个Index:4交换位置,变换位置之后这棵子树就不是大根堆了,我们来开始调整。

(6)4和3中的最大者4和2进行交换,那这个子树已经调整为大根堆。

(7)实际数组变化如下

(8)第一个结点和最后一个Index:3交换位置,变换位置之后这棵子树就不是大根堆了,我们来开始调整。

(9)发现不需要调整,本来就是大根堆,完美。

(10)那我们交换一下第一个结点和最后一个Index:2交换位置。n个元素需要调整n-1次,五个元素我们已经调整了4次,堆已经是升序排列了。

(11)实际数组变化如下

十、堆排序代码

1、HeapSiftSentrySqQueue

Status HeapSiftSentrySqQueue(SqQueue* Queue, QueueLenType StartSiftIndex, QueueLenType EndSiftIndex)
{
    JudgeAllNullPointer(Queue);
    
    QueueLenType i     = StartSiftIndex;
    QueueLenType j     = 2 * i;
    int*         Array = (int*)(Queue->Data);

    while (j <= EndSiftIndex)//满足的话,表示有左右子树。
    {
        if (j < EndSiftIndex && Array[j] < Array[j + 1])//第一个条件成立的话,表示还有右子树。如果右子树大于左子树,将索引号移动到右子树上。
        {
            j++;
        }
        if (Array[i] < Array[j])//子树与根节点比较,如果子树大,进入此判断,进行数据交换。
        {
            Array[0] = Array[i];
            Array[i] = Array[j];
            Array[j] = Array[0];
        }
        i = j;    //移动到下一个子树的根节点。
        j = 2 * i;//移动到下一个子树的根节点的子树。
    }
    
    LogFormat(Debug,"Heap Sift Sentry SqQueue OK.\n");

    return SuccessFlag;
}

2、HeapSortSentrySqQueue

//需要一个哨兵,也就是预留位置,为的是方便通过数组计算左右子树。
Status HeapSortSentrySqQueue(SqQueue* Queue)
{
    JudgeAllNullPointer(Queue);

    if (Queue->Flag != INT_TYPE_FLAG)
    {
        return FailFlag;
    }
    
    QueueLenType i;
    QueueLenType EndIndex = Queue->SqQueueLen - 1;
    int*         Array    = (int*)(Queue->Data);

    for (i = EndIndex / 2; i >= 1; i--)//从下往上建立大根堆
    {
       HeapSiftSentrySqQueue(Queue, i, EndIndex);
    }

    //堆调整变化为升序序列,从上往下进行调整。
    //n个元素需要调整n-1次。
    for (i = 1; i <= EndIndex - 1; i++)
    {
        Array[0]                = Array[1];
        Array[1]                = Array[EndIndex - i + 1];
        Array[EndIndex - i + 1] = Array[0];
        HeapSiftSentrySqQueue(Queue, 1, EndIndex - i);
    }
    LogFormat(Debug,"Heap Sort Sentry SqQueue OK.\n");

    return SuccessFlag;
}

十一、堆排序算法分析

情况时间复杂度是否稳定
最好O(n * log2^n)不稳定
最坏O(n * log2^n)
平均O(n * log2^n)

1、最大优点

堆排序在最坏情况、最好情况下都是O(n * log2^n),都不会使排序处于

最优或最差的状态。

2、辅助存储空间

仅需要一个辅助空间,也就是哨兵位或0号位。

3、适用情况

适用于待排序记录个数n较大的情况。

十二、堆排序Linux环境编译测试

[gbase@czg2 Sort]$ make
gcc -Wall -Wextra -O3 InsertSort.c SwapSort.c SelectSort.c MergeSort.c BucketSort.c main.c -o TestSort -I /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/Log/ -I /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/ -I /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/HashTable/include/ -I /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/SqQueue/ -I /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/SqStack/ -L /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/Make/Libs/ -lPublicFunction -lLog -lSqQueue
[gbase@czg2 Sort]$ time ./TestSort 
2023-9-8--[ Debug ]--Init SqQueue OK
2023-9-8--[ Debug ]--Enter SqQueue OK
2023-9-8--[ Debug ]--Enter SqQueue OK
2023-9-8--[ Debug ]--Enter SqQueue OK
2023-9-8--[ Debug ]--Enter SqQueue OK
2023-9-8--[ Debug ]--Enter SqQueue OK
2023-9-8--[ Debug ]--Enter SqQueue OK
2023-9-8--[ Debug ]--Enter SqQueue OK
2023-9-8--[ Debug ]--Enter SqQueue OK
2023-9-8--[ Debug ]--Enter SqQueue OK
2023-9-8--[ Debug ]--Enter SqQueue OK
2023-9-8--[ Debug ]--Enter SqQueue OK
2023-9-8--[ Info  ]--SqQueue Data   :
Data           : [ 0 ,5 ,6 ,7 ,8 ,9 ,0 ,1 ,2 ,3 ,4 ]
FrontIndex     : 0
RearIndex      : 0
SqQueueLen     : 11
SqQueueMaxLen  : 11
Flag           : INT_TYPE_FLAG
2023-9-8--[ Debug ]--Heap Sift Sentry SqQueue OK.
2023-9-8--[ Debug ]--Heap Sift Sentry SqQueue OK.
2023-9-8--[ Debug ]--Heap Sift Sentry SqQueue OK.
2023-9-8--[ Debug ]--Heap Sift Sentry SqQueue OK.
2023-9-8--[ Debug ]--Heap Sift Sentry SqQueue OK.
2023-9-8--[ Debug ]--Heap Sift Sentry SqQueue OK.
2023-9-8--[ Debug ]--Heap Sift Sentry SqQueue OK.
2023-9-8--[ Debug ]--Heap Sift Sentry SqQueue OK.
2023-9-8--[ Debug ]--Heap Sift Sentry SqQueue OK.
2023-9-8--[ Debug ]--Heap Sift Sentry SqQueue OK.
2023-9-8--[ Debug ]--Heap Sift Sentry SqQueue OK.
2023-9-8--[ Debug ]--Heap Sift Sentry SqQueue OK.
2023-9-8--[ Debug ]--Heap Sift Sentry SqQueue OK.
2023-9-8--[ Debug ]--Heap Sift Sentry SqQueue OK.
2023-9-8--[ Debug ]--Heap Sort Sentry SqQueue OK.
2023-9-8--[ Info  ]--Sort Function Elapsed Time   : 0 s
2023-9-8--[ Info  ]--SqQueue Data   :
Data           : [ 1 ,0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ]
FrontIndex     : 0
RearIndex      : 0
SqQueueLen     : 11
SqQueueMaxLen  : 11
Flag           : INT_TYPE_FLAG
2023-9-8--[ Debug ]--Destroy SqQueue OK

real    0m0.003s
user    0m0.001s
sys     0m0.001s

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

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

相关文章

MySQL数据表的约束

数据表约束&#xff1a;对于某一列的值能添加哪些内容做了一定的限制&#xff0c;这种限制的手段就称为约束。 &#xff08;一&#xff09;约束的类型 NOT NULL 指示某列不能存储 NULL 值。UNIQUE保证某列的每行必须有唯一的值。DEFAULT规定没有给列赋值时的默认值。PRIMARY …

利用less实现多主题切换(配合天气现象)

1. 先看效果&#xff1a; 2. 话不多说直接撸吧&#xff1a; 原理&#xff1a;先给body元素添加style&#xff0c;再根据天气现象动态更改style 开撸&#xff1a; 创建src/assets/style/variables.less 使用 XXX:var(–XXX,‘style’) 声明系列变量&#xff0c;之后添加其他变…

redis如何保证接口的幂等性

背景 如何防止接口中同样的数据提交&#xff0c;以及如何保证消息不被重复消费&#xff0c;这些都是shigen在学习的过程中遇到的问题。今天&#xff0c;趁着在学习redis的间隙&#xff0c;我写了一篇文章进行简单的实现。 注意&#xff1a;仅使用于单机的场景&#xff0c;对于…

春秋云镜 CVE-2017-1000480

春秋云镜 CVE-2017-1000480 Smarty < 3.1.32 PHP代码执行漏洞 靶标介绍 3.1.32 之前的 Smarty 3 在未清理模板名称的自定义资源上调用 fetch() 或 display() 函数时容易受到 PHP 代码注入的影响。 启动场景 漏洞利用 poc /index.php?eval*/phpinfo();/*/index.php?ev…

原生JavaScript+PHP多图上传实现

摘要 很多场景下需要选择多张图片上传&#xff0c;或者是批量上传以提高效率&#xff0c;多图上传的需求自然就比较多了&#xff0c;本文使用最简单的XMLHttpRequest异步上传图片。 界面 上传示例 代码 index.html <!DOCTYPE html> <html><head><titl…

node.js下载安装环境配置以及快速使用

目录 一、下载 二、安装 三、测试安装是否成功 四、配置环境 五、测试配置环境是否成功 六、安装淘宝镜像 七、快速上手 1、建立一个自己的工作目录 2、下载工作代码 八、各种配置文件匹配问题入坑 九、总结 一、下载 Node.js 中文网 想选择其他版本或者其他系统使用…

【Chrome】chrome浏览器未连接到互联网

问题描述 电脑上安装了一个联想电脑管家&#xff0c;进行了一下清理&#xff0c;并优化了一下启动项&#xff0c;Chrome浏览器突然什么网站都无法访问了。以为更新坏了&#xff0c;但相同的网站放到火狐浏览器上&#xff0c;竟然可以打开&#xff0c;怎么回事呢&#xff1f;怎…

使用EMgu检测人脸

1,安装EMgu 在NuGet中,查找并安装EMgu 2,做人脸检测 首先,声明几个重要的类 //Thread.Sleep(3000);matImg = new Mat();capture.Retrieve(matImg, 0); frame=new Image<Bgr, byte>(matImg.Bitmap); 当,frame != null时,检测到人脸 3,给人脸画框 i…

MySQL主从分离读写复制

在高负载的生产环境里&#xff0c;把数据库进行读写分离&#xff0c;能显著提高系统的性能。下面对MySQL的进行读写分离。 试验环境 A机&#xff1a;IP:192.168.0.1 mysql版本&#xff1a;mysql-5.6.4,主数据服务器&#xff08;只写操作&#xff09; B机&#xff1a;IP:192.…

SpringMVC_执行流程

四、SpringMVC执行流程 1.SpringMVC 常用组件 DispatcherServlet&#xff1a;前端控制器&#xff0c;用于对请求和响应进行统一处理HandlerMapping&#xff1a;处理器映射器&#xff0c;根据 url/method可以去找到具体的 Handler(Controller)Handler:具体处理器&#xff08;程…

SpringMVC实现增删改查

文章目录 一、配置文件1.1 导入相关pom依赖1.2 jdbc.properties&#xff1a;配置文件1.3 generatorConfig.xml&#xff1a;代码生成器1.4 spring-mybatis.xml &#xff1a;spring与mybatis整合的配置文件1.5 spring-context.xml &#xff1a;上下文配置文件1.6 spring-mvc-xml:…

uni-app 之 获取网络列表数据

uni-app 之 获取网络列表数据 image.png <template><!-- vue2的<template>里必须要有一个盒子&#xff0c;不能有两个&#xff0c;这里的盒子就是 view--><view>--- uni.request 网络请求API接口 ---<view v-for"(item) in caturl" :key&…

学信息系统项目管理师第4版系列05_组织通用管理

1. 流程管理 1.1. 流程是组织运行体系的框架基础&#xff0c;流程框架的质量影响和决定了整个组织运行体系的质量 1.2. 流程是指工作活动流转的过程 1.2.1. 流程可以是跨部门、跨岗位工作活动流转的过程 1.3. 业务流程是一组将输入转化为输出的相互关联或相互作用的活动 1…

NPM 常用命令(六)

1、npm explain 1.1 命令使用 npm explain <package-spec>别名: why 1.2 描述 此命令将打印导致在当前项目被其他引用包的依赖链。 如果提供了一个或多个包规范&#xff0c;则只有与其中一个说明符匹配的包才会解释它们的关系。 包规范还可以引用 ./node_modules 中…

Typescript技术分享

1、初识TypeScript TypeScript是什么&#xff1f; TypeScript 是一种由微软开发的自由和开源的编程语言。它是 JavaScript 的一个超集。TypeScript 在 JavaScript 的基础上添加了可选的静态类型和基于类的面向对象编程。 2、TS类型 2.1 布尔类型(boolean) boolean类型只有两个取…

重建与发展:数字资产借贷行业朝着可持续发展迈进!

纵观历史&#xff0c;贷款和货币一样古老&#xff0c;无论哪种形式的货币都需要有其借贷市场。现在&#xff0c;比特币以其分散和透明的性质&#xff0c;在加密领域占据龙头地位。 就像之前的货币一样&#xff0c;比特币要真正蓬勃发展&#xff0c;也需要一个强大的借贷市场。然…

2023计算机毕业设计题目 毕设选题大全

文章目录 0 前言1 java web 管理系统 毕设选题2 java web 平台/业务系统 毕设选题3 游戏设计、动画设计类 毕设选题 (适合数媒的同学)4 算法开发5 数据挖掘 毕设选题6 大数据处理、云计算、区块链 毕设选题7 网络安全 毕设选题8 通信类/网络工程 毕设选题9 嵌入式 毕设选题10 开…

数据中心的未来是什么?

数据中心作为数字化经济的基础设施&#xff0c;在未来的发展中将会呈现出以下几个趋势和变化&#xff1a;多云环境的普及&#xff1a;未来的数据中心将会逐渐实现多云环境的兼容和协同&#xff0c;支持从公共云、私有云到混合云的多重部署模式。多云化环境将提供更多的选择和灵…

Matlab图像处理-最大类间方差阈值选择法(Otsu)

基本思想 最大类间方差阈值选择法又称为Otsu 算法&#xff0c;该算法是在灰度直方图的基础上用最小二乘法原理推导出来的&#xff0c;具有统计意义上的最佳分割阈值。它的基本原理是以最佳阈值将图像的灰度直方图分割成两部分&#xff0c;使两部分之间的方差取得最大值&#x…

全球城市汇总【最新】

文章目录 案例图国家城市大洲 数据 全球城市、国家、介绍汇总。包含 .csv .sql .xml 格式数据。 案例图 国家 城市 大洲 数据 获取上图资源绑定 https://blog.csdn.net/qq_40374604/category_12435042.html 如找不到在合集中查找。