数据结构与算法基础-学习-34-基数排序(桶排序)

目录

一、基本思想

二、算法思路

1、个位排序

(1)分配

(2)收集

2、十分位排序

(1)分配

(2)收集

三、源码分享

1、InitMyBucket

2、DestroyMyBucket

3、ClearMyBucket

4、PushData2Bucket

5、PopDataFromBucket

6、GetIntegerDigit

7、BucketSortSentryQueue

四、算法效率

五、Linux环境编译测试


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

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

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

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

《数据结构与算法基础-学习-33-归并排序》

一、基本思想

基数排序的基本思想就是分配和收集。

基数排序也叫桶排序、箱排序,设置若干个桶,将关键字为k的记录放入第k个桶,然后再按照序号将非空的连接。

二、算法思路

我们还是以升序为例,初始化10个桶来存放数据,因为上面的数据最多到十分位,我们只需要两部就可以完成排序。

1、个位排序

(1)分配

10的个位是0,放到0号桶。

34的个位是4,放到4号桶。

1的个位是1,放到1号桶。

后面的数据以此类推。

(2)收集

我们按照顺序从第0个桶、第1个桶。。。。的顺序取数据,可以发现个位已经有序。并且只有个位的元素就不需要进行下一轮十分位的排序,我们只用比较有十分位的元素,这样可以减少排序时间。收集前桶中数据是全部,为了效率我们可以直接把只有个位的放入原序列中。

2、十分位排序

(1)分配

我们清空桶,将临时队列中的元素按照十分位的数值放入桶中。

(2)收集

我们按照顺序从第0个桶、第1个桶。。。。的顺序取数据,由于这些元素只有最大十分位,我们可以直接放入原队列中,这样就排好序啦。

三、源码分享

1、InitMyBucket

Status InitMyBucket(MyBucket** Bucket, QueueLenType BucketGroupNums, QueueLenType OneBucketNums, JudgeTypeFlag Flag)
{JudgeAllNullPointer(Bucket);if (BucketGroupNums * OneBucketNums > __LONG_LONG_MAX__){LogFormat(Error,"Init Bucket Fail, Reason : BucketGroupNums(%lld) * OneBucketNums(%lld) > %lld.\n",BucketGroupNums,OneBucketNums,__LONG_LONG_MAX__);return FailFlag;}QueueLenType i;(*Bucket)                       = (MyBucket*)MyMalloc(sizeof(MyBucket));(*Bucket)->BucketArrayMaxLen    = BucketGroupNums;(*Bucket)->BucketDataUseNums    = 0;(*Bucket)->BucketDataMaxUseNums = BucketGroupNums * OneBucketNums;(*Bucket)->BucketArray          = (SqQueue**)MyMalloc(BucketGroupNums * sizeof(SqQueue*));for ( i = 0; i < (*Bucket)->BucketArrayMaxLen; i++){InitSqQueue(&((*Bucket)->BucketArray[i]),OneBucketNums,Flag);}LogFormat(Debug,"Init Bucket OK.\n");return SuccessFlag;
}

2、DestroyMyBucket

Status DestroyMyBucket(MyBucket** Bucket)
{JudgeAllNullPointer(*Bucket);QueueLenType i;for ( i = 0; i < (*Bucket)->BucketArrayMaxLen; i++){DestroySqQueue(&((*Bucket)->BucketArray[i]));}free((*Bucket)->BucketArray);(*Bucket)->BucketArray          = NULL;(*Bucket)->BucketArrayMaxLen    = 0;(*Bucket)->BucketDataUseNums    = 0;(*Bucket)->BucketDataMaxUseNums = 0;free(*Bucket);*Bucket                         = NULL;LogFormat(Debug,"Destroy Bucket OK.\n");return SuccessFlag;
}

3、ClearMyBucket

Status ClearMyBucket(MyBucket* Bucket)
{JudgeAllNullPointer(Bucket);QueueLenType i;for ( i = 0; i < Bucket->BucketArrayMaxLen; i++){ClearSqQueue(Bucket->BucketArray[i]);}Bucket->BucketDataUseNums = 0;LogFormat(Debug,"Clear Bucket OK.\n");return SuccessFlag;
}

4、PushData2Bucket

//将数据压入桶中。
Status PushData2Bucket(MyBucket* Bucket, QueueLenType BucketGroupIndex, void* Data)
{JudgeAllNullPointer(Bucket);JudgeAllNullPointer(Data);if (BucketGroupIndex < 0 || BucketGroupIndex >= Bucket->BucketArrayMaxLen){LogFormat(Error,"Push Data To Bucket Fail, Reason : Illegal BucketGroupIndex(%lld).\n",BucketGroupIndex);return FailFlag;}if (Bucket->BucketDataUseNums == Bucket->BucketDataMaxUseNums){LogFormat(Warning,"Push Data To Bucket Fail, Reason : Bucket Is Full(%lld).\n",Bucket->BucketDataMaxUseNums);return NormalFlag;}Status ReturnStatus;ReturnStatus = EnterSqQueue(Bucket->BucketArray[BucketGroupIndex],Data);if (ReturnStatus == SuccessFlag){Bucket->BucketDataUseNums++;LogFormat(Debug,"Push Data To Bucket OK.\n");}return ReturnStatus;
}

5、PopDataFromBucket

//将数据从桶中取出来。
Status PopDataFromBucket(MyBucket* Bucket, QueueLenType BucketGroupIndex, void* Data)
{JudgeAllNullPointer(Bucket);JudgeAllNullPointer(Data);if (BucketGroupIndex < 0 || BucketGroupIndex >= Bucket->BucketArrayMaxLen){LogFormat(Error,"Pop Data From Bucket Fail, Reason : Illegal BucketGroupIndex(%lld).\n",BucketGroupIndex);return FailFlag;}if (Bucket->BucketDataUseNums == 0){LogFormat(Warning,"Pop Data From Bucket Fail, Reason : Bucket Is Empty.\n");return NormalFlag;}Status ReturnStatus;ReturnStatus = LeaveSqQueue(Bucket->BucketArray[BucketGroupIndex],Data);if (ReturnStatus == SuccessFlag){Bucket->BucketDataUseNums--;LogFormat(Debug,"Pop Data From Bucket OK.\n");}return ReturnStatus;
}

6、GetIntegerDigit

//给出一个正整数,和你想要的位数,返回相应的位数。
//例如1234,你要十分位,返回一个3。
//1表示个位,2表示十分位,以此类推。 
//目前只支持int类型
int GetIntegerDigit(int Num, int Digit)
{// LogFormat(Debug,"Num : %d, Digit : %d\n",Num,Digit);if (Digit < 1 || Digit > 9){return GET_INTEGER_DIGIT_FAIL_FLAG;}if (Num < 0){return GET_INTEGER_DIGIT_FAIL_FLAG;}if (Digit == 1){return Num % 10;}else if (MyIntSquare(10,Digit - 1) > Num)//如果Num不存在Digit相应的位数,如89不存在百分位的情况。{return GET_INTEGER_DIGIT_NO_EXISTS_FLAG;}else{return (Num % MyIntSquare(10,Digit) - Num % MyIntSquare(10,Digit - 1)) / MyIntSquare(10,Digit - 1);}
}

7、BucketSortSentryQueue

//由于GetIntegerDigit实现的原因,导致BucketSortSentryQueue只支持正整数排序。
//此函数如果执行出错,会改变Queue的值,里面存了中间结果。
Status BucketSortSentryQueue(SqQueue* Queue)
{JudgeAllNullPointer(Queue);MyBucket* Bucket   = NULL;SqQueue*  TmpQueue = NULL;//临时队列,存放中间数据。switch(Queue->Flag){case INT_TYPE_FLAG  :InitMyBucket(&Bucket,INTEGER_BUCKET_NUMS,Queue->SqQueueLen,Queue->Flag);InitSqQueue(&TmpQueue,Queue->SqQueueLen,Queue->Flag);break;default :LogFormat(Error,"BucketSortSentry Function , Queue->Flag(%d) Is Unknow Type Flag, Exit!!!\n",Queue->Flag);exit(ExceptionExitFlag);}//后续再做成万能数据型//现在只支持整型int          ReutrnVal        = 0;QueueLenType i;QueueLenType BucketGroupIndex = 0;Status       ReturnStatus;int          Digit            = 1;//计算的位数QueueLenType MaxQueueLen      = Queue->SqQueueLen;do{if (Digit != 1){//第n次收集是从TmpQueue读取数据,做整数Digit位的排序,放入桶中。for ( i = 0; i < TmpQueue->SqQueueLen; i++){ReadSqQueue(TmpQueue,i,&ReutrnVal);BucketGroupIndex = GetIntegerDigit(ReutrnVal,Digit);PushData2Bucket(Bucket, BucketGroupIndex, &ReutrnVal);}//清理临时队列。ClearSqQueue(TmpQueue);}else{//第一次收集是从传入参数Queue读取数据,做整数个位的排序,放入桶中。for ( i = 1; i < Queue->SqQueueLen; i++){ReadSqQueue(Queue,i,&ReutrnVal);BucketGroupIndex = GetIntegerDigit(ReutrnVal,Digit);PushData2Bucket(Bucket, BucketGroupIndex, &ReutrnVal);}ReadSqQueue(Queue,0,&ReutrnVal);ClearSqQueue(Queue);EnterSqQueue(Queue,&ReutrnVal);}//第n次分配,从桶中把顺序数据读取出来。i = 0;Digit++;while (Bucket->BucketDataUseNums != 0){ReturnStatus = PopDataFromBucket(Bucket, i, &ReutrnVal);if (ReturnStatus == SuccessFlag)//成功读出数据,放入临时队列中。{if (GetIntegerDigit(ReutrnVal,Digit) == GET_INTEGER_DIGIT_NO_EXISTS_FLAG)//如果给的数没有Digit,放到最终队列中。{EnterSqQueue(Queue,&ReutrnVal);}else if (GetIntegerDigit(ReutrnVal,Digit) != GET_INTEGER_DIGIT_FAIL_FLAG)//有Digit的进行下一步计算。{EnterSqQueue(TmpQueue,&ReutrnVal);}else//异常情况{LogFormat(Error,"Bucket Sort Sentry Queue Fail, Reason : Error Data(%d).\n",ReutrnVal);exit(ExceptionExitFlag);}}else if (ReturnStatus == NormalFlag)//由于第i个桶的数据被读取完了,读下一个桶。{i++;}else//读取数据失败{DestroyMyBucket(&Bucket);DestroySqQueue(&TmpQueue);Bucket   = NULL;TmpQueue = NULL;LogFormat(Error,"Bucket Sort Sentry Queue Fail, Reason : Pop Data From Bucket Fail.\n");return FailFlag;}}//清理桶ClearMyBucket(Bucket);}while (GetSqQueueLen(Queue) < MaxQueueLen);//如果最终结果队列的元素个数小于Queue队列的元素个数,说明数据没有排序完。DestroyMyBucket(&Bucket);DestroySqQueue(&TmpQueue);Bucket   = NULL;TmpQueue = NULL;LogFormat(Debug,"Bucket Sort Sentry Queue OK.\n");return SuccessFlag;
}

四、算法效率

情况时间复杂度是否稳定
最好O(n + m)稳定
最坏O(k * (n + m))
平均O(k * (n + m))

例如我们上面这个计算时间复杂度是多少呢?

 (10个数字 + 10个桶)* 2位数 = 40

五、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-12--[ Debug ]--Init SqQueue OK
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ 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-12--[ Debug ]--Init SqQueue OK
2023-9-12--[ Debug ]--Init SqQueue OK
2023-9-12--[ Debug ]--Init SqQueue OK
2023-9-12--[ Debug ]--Init SqQueue OK
2023-9-12--[ Debug ]--Init SqQueue OK
2023-9-12--[ Debug ]--Init SqQueue OK
2023-9-12--[ Debug ]--Init SqQueue OK
2023-9-12--[ Debug ]--Init SqQueue OK
2023-9-12--[ Debug ]--Init SqQueue OK
2023-9-12--[ Debug ]--Init SqQueue OK
2023-9-12--[ Debug ]--Init Bucket OK.
2023-9-12--[ Debug ]--Init SqQueue OK
2023-9-12--[ Debug ]--Read  SqQueue OK
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--Push Data To Bucket OK.
2023-9-12--[ Debug ]--Read  SqQueue OK
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--Push Data To Bucket OK.
2023-9-12--[ Debug ]--Read  SqQueue OK
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--Push Data To Bucket OK.
2023-9-12--[ Debug ]--Read  SqQueue OK
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--Push Data To Bucket OK.
2023-9-12--[ Debug ]--Read  SqQueue OK
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--Push Data To Bucket OK.
2023-9-12--[ Debug ]--Read  SqQueue OK
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--Push Data To Bucket OK.
2023-9-12--[ Debug ]--Read  SqQueue OK
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--Push Data To Bucket OK.
2023-9-12--[ Debug ]--Read  SqQueue OK
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--Push Data To Bucket OK.
2023-9-12--[ Debug ]--Read  SqQueue OK
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--Push Data To Bucket OK.
2023-9-12--[ Debug ]--Read  SqQueue OK
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--Push Data To Bucket OK.
2023-9-12--[ Debug ]--Read  SqQueue OK
2023-9-12--[ Debug ]--Clear SqQueue OK
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--Leave SqQueue OK
2023-9-12--[ Debug ]--Pop Data From Bucket OK.
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--SqQueue is Empty, Data cannot be left
2023-9-12--[ Debug ]--Leave SqQueue OK
2023-9-12--[ Debug ]--Pop Data From Bucket OK.
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--SqQueue is Empty, Data cannot be left
2023-9-12--[ Debug ]--Leave SqQueue OK
2023-9-12--[ Debug ]--Pop Data From Bucket OK.
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--SqQueue is Empty, Data cannot be left
2023-9-12--[ Debug ]--Leave SqQueue OK
2023-9-12--[ Debug ]--Pop Data From Bucket OK.
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--SqQueue is Empty, Data cannot be left
2023-9-12--[ Debug ]--Leave SqQueue OK
2023-9-12--[ Debug ]--Pop Data From Bucket OK.
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--SqQueue is Empty, Data cannot be left
2023-9-12--[ Debug ]--Leave SqQueue OK
2023-9-12--[ Debug ]--Pop Data From Bucket OK.
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--SqQueue is Empty, Data cannot be left
2023-9-12--[ Debug ]--Leave SqQueue OK
2023-9-12--[ Debug ]--Pop Data From Bucket OK.
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--SqQueue is Empty, Data cannot be left
2023-9-12--[ Debug ]--Leave SqQueue OK
2023-9-12--[ Debug ]--Pop Data From Bucket OK.
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--SqQueue is Empty, Data cannot be left
2023-9-12--[ Debug ]--Leave SqQueue OK
2023-9-12--[ Debug ]--Pop Data From Bucket OK.
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--SqQueue is Empty, Data cannot be left
2023-9-12--[ Debug ]--Leave SqQueue OK
2023-9-12--[ Debug ]--Pop Data From Bucket OK.
2023-9-12--[ Debug ]--Enter SqQueue OK
2023-9-12--[ Debug ]--Clear SqQueue OK
2023-9-12--[ Debug ]--Clear SqQueue OK
2023-9-12--[ Debug ]--Clear SqQueue OK
2023-9-12--[ Debug ]--Clear SqQueue OK
2023-9-12--[ Debug ]--Clear SqQueue OK
2023-9-12--[ Debug ]--Clear SqQueue OK
2023-9-12--[ Debug ]--Clear SqQueue OK
2023-9-12--[ Debug ]--Clear SqQueue OK
2023-9-12--[ Debug ]--Clear SqQueue OK
2023-9-12--[ Debug ]--Clear SqQueue OK
2023-9-12--[ Debug ]--Clear Bucket OK.
2023-9-12--[ Debug ]--Destroy SqQueue OK
2023-9-12--[ Debug ]--Destroy SqQueue OK
2023-9-12--[ Debug ]--Destroy SqQueue OK
2023-9-12--[ Debug ]--Destroy SqQueue OK
2023-9-12--[ Debug ]--Destroy SqQueue OK
2023-9-12--[ Debug ]--Destroy SqQueue OK
2023-9-12--[ Debug ]--Destroy SqQueue OK
2023-9-12--[ Debug ]--Destroy SqQueue OK
2023-9-12--[ Debug ]--Destroy SqQueue OK
2023-9-12--[ Debug ]--Destroy SqQueue OK
2023-9-12--[ Debug ]--Destroy Bucket OK.
2023-9-12--[ Debug ]--Destroy SqQueue OK
2023-9-12--[ Debug ]--Bucket Sort Sentry Queue OK.
2023-9-12--[ Info  ]--Sort Function Elapsed Time   : 0 s
2023-9-12--[ Info  ]--SqQueue Data   :
Data           : [ 0 ,0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ]
FrontIndex     : 0
RearIndex      : 0
SqQueueLen     : 11
SqQueueMaxLen  : 11
Flag           : INT_TYPE_FLAG
2023-9-12--[ Debug ]--Destroy SqQueue OKreal    0m0.002s
user    0m0.002s
sys     0m0.000s

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JMeter接口测试

0.前言, 我决定我的代码必须要提升性能了,而不是写不写得出来的问题了, however,怎么知道我的代码是不是很烂和健壮性,需要专业的测试工具来测试出来,如高并发QPS是什么?,高频率是什么? 怎样自动化测试解放双手 1.jmeter是apache使用java的测试工具,模拟巨大的负载,官网地址…

C++ 特性模版

目录 1. 非类型模板参数 2. 模板的特化 2.1 概念 2.2 函数模板特化 2.3 类模板特化 2.3.1 全特化 2.3.2 偏特化 2.3.3 类模板特化应用示例 3 模板分离编译 3.1 什么是分离编译 3.2 模板的分离编译 3.3 解决方法 4. 模板总结 1. 非类型模板参数 模板参数分类类型形…

数据库数据恢复-Oracle数据库truncate的数据恢复案例

Oracle数据库故障&分析&#xff1a; 北京某单位Oracle 11g R2数据库误执行truncate table CM_CHECK_ITEM_HIS&#xff0c;表数据丢失&#xff0c;查询该表时报错。数据库备份无法使用&#xff0c;表数据无法查询。 Oracle数据库Truncate数据的机理&#xff1a;执行Trunca…

如何初始化静态成员在类中

c - How do I initialize a const data member? - Stack Overflow

【GO语言基础】基本数据类型

系列文章目录 【Go语言学习】ide安装与配置 【GO语言基础】前言 【GO语言基础】变量常量 【GO语言基础】数据类型 文章目录 系列文章目录数据类型数值型&#xff1a;整数类型&#xff1a;浮点数类型&#xff1a; 字符型-布尔型-字符串零值转义字符 常用类型转换运算符总结 数据…

2023-9-11 台阶-Nim游戏

题目链接&#xff1a;台阶-Nim游戏 #include <iostream> #include <algorithm>using namespace std;int main() {int n;cin >> n;int res 0;for(int i 1;i < n; i){int x;cin >> x;if(i % 2) res ^ x; }if(res) cout << "Yes" &l…

Ask Milvus Anything!聊聊被社区反复@的那些事儿 Ⅰ

作为用户备受期待的重大版本&#xff0c;Milvus 2.3 不仅新上线了实用的新功能&#xff0c;还对已有功能的进行更新和优化。因此&#xff0c;新版本一经发布&#xff0c;便受到了社区用户的热切关注&#xff0c;期间我们也陆陆续续收到了不少用户的使用体验及问题反馈。 为了给…

多元共进|科技促进艺术发展,助力文化传承

科技发展助力文化和艺术的传播 融合传统与创新&#xff0c;碰撞独特魅力 一起来了解 2023 Google 开发者大会上 谷歌如何依托科技创新 推动艺术与文化连接 传承和弘扬传统文化 自 2011 年成立以来&#xff0c;谷歌艺术与文化致力于提供体验艺术和文化的新方式&#xff0c;…

HarmonyOS/OpenHarmony应用开发-DevEco Studio 中文插件的使用

DevEco Studio按照后&#xff0c;各项菜单栏默认是英文的&#xff0c;很多初学者&#xff0c;把菜单栏调整为中文的后&#xff0c;更容易上手与操作。具体步骤如下&#xff1a; 一、打开文件 二、选择设置 三、选择插件 四、选择中文 五、询问是否马上重启&#xff0c;本文选择…

2022年全国研究生数学建模竞赛华为杯E题草原放牧策略研究求解全过程文档及程序

2022年全国研究生数学建模竞赛华为杯 E题 草原放牧策略研究 原题再现&#xff1a; 一、背景介绍   草原作为世界上分布最广的重要的陆地植被类型之一&#xff0c;分布面积广泛。中国的草原面积为3.55亿公顷&#xff0c;是世界草原总面积的6%~8%&#xff0c;居世界第二。此外…

Python的get请求报错Error: Unexpected status code 400

一句话导读&#xff1a; 最近在做研发效能提升的事情&#xff0c;其中有一块就是要对项目管理相关数据做统计&#xff0c;我们使用的是ones做的项目管理&#xff0c;ones本身带的那些报表满足不了我们的需求&#xff0c;就想着看这些数据是不是能自己拿出来做统计&#xff0c;有…

Qt应用开发(基础篇)——菜单 QMenu

一、前言 QMenu类继承于QWidget&#xff0c;它提供了一个菜单样式的小部件&#xff0c;用于菜单栏、上下文菜单和一些弹出式菜单。 QMenu菜单的选项是可选的&#xff0c;它可以是一个下拉的菜单&#xff0c;也可以是独立的上下文菜单。下拉菜单通常作用于当用户单击相应的项目或…