使用模版完成不同数据类型的数组的选择排序

目录

6.模版(167-263)

6.1函数模板

6.1.1函数模版注意事项

6.1.2函数模版案例--选择排序

1. 比较排序的基本概念

2. 决策树

3. 决策树的深度

4. 结论

5.选择排序示例:


6.模版(167-263)

(项目先跳过)

  1. 模板不能直接使用,它只是一个框架.

  2. 模板不是万能的.

6.1函数模板

建立一个通用函数,其函数返回值类型和形参类型可以不具体指定,用一个虚拟的类型来表示.

语法:

template<typename T>//template声明创建模版 typename表明一种数据类型
其中typename可以用class代替 T可以替换为其他大写字母 但是通常用T
//如果不使用函数模版
void swap(int& a,int &b)
{
int temp = a;
a = b;
b = temp;
}
void swap(double& a,double& b)
{
double temp =a;
a = b;
b = temp;
}
//使用函数模板
template<typename T>
void MySwap(T& a,T& b)
{T temp = a;a = b;b = temp;
}
//使用函数模版的方法
//1.自动类型推导
//2.显示指定类型
MySwap(a,b);
MySwap<int>(a,b);

总结:

模版的目的是为了提高复用性,将类型参数化.

6.1.1函数模版注意事项
  • 自动类型推导,必须推导出一致的数据类型T,才可以使用

  • 模板必须要确定T的数据类型,才可以使用.

6.1.2函数模版案例--选择排序
#include<iostream>
template<typename T>
void chooseSort()
{}

(O(n \log n)) 是比较排序算法(如快速排序、归并排序和堆排序)在最坏情况下时间复杂度的一个理论上限。下面详细解释它是怎么计算出来的:

1. 比较排序的基本概念

在比较排序中,排序过程依赖于比较操作(如大小比较)来确定元素的相对顺序。每次比较只能得出两个元素之间的大小关系,因此我们可以将所有可能的排序视为一个决策树。

2. 决策树

  • 决策树的构建

    • 每个节点代表一次比较。

    • 每条边代表比较结果(如左边较小,右边较大)。

    • 叶子节点表示一种可能的排序结果。

  • 叶子节点的数量: 假设有 (n) 个元素,所有可能的排序方式有 (n!) 种。这意味着决策树必须至少包含 (n!) 个叶子节点。

3. 决策树的深度

  • 树的深度与比较次数: 决策树的深度对应于最坏情况下可能需要的比较次数。由于树的每一层最多有 (2) 个分支,如果树的高度为 (h),那么节点的数量不超过 (2^h)。因此,可以得到: 


    2^h \geq n!

     

  • 使用斯特灵近似: 通过斯特灵近似可以近似估计 (n!): 


    n! \approx \sqrt{2 \pi n} \left( \frac{n}{e} \right)^n
     

  • 取对数: 为了解决这个不等式,可以取对数: [


    h \cdot \log(2) \geq \log(n!)
     

     

    ] 结合斯特灵近似: [


    \log(n!) \approx n \log(n) - n
     

    ]

  • 最终得出比较次数: 所以,将 (h) 进行估算: [


    h \geq \frac{n \log(n)}{\log(2)} - O(n)
     

    ] 这表明,最坏情况下的比较次数(以及对应的时间复杂度)为: [


    \Theta(n \log n)
     

    ]

4. 结论

综上所述,因为决策树的深度反映了需要的最坏情况下的比较次数,而叶子节点的数量等于 (n!)(所有可能的排序),最终得到的结论是:任何基于比较的排序算法在最坏情况下的时间复杂度不能低于 (O(n \log n))。 

5.选择排序示例:

#include <iostream> 
using namespace std;
//利用函数模版实现不同类型的选择排序,将数组中的元素改为从大到小排序
template<typename T>
void Myswap(T& a,T&b)
{T temp = a;a = b;b = temp;
}
template<typename T>
void sort(T arr[],int length)
{for (int i = 0; i < length; i++){T max = arr[i];//think twice before coding. T代表一种数据类型 不能是T[],而是用数组名arr[].for (int j = i + 1; j < length; j++){if (arr[j] > max){max = arr[j];//arr[j] = arr[i];//arr[i] = max;//实际上,也可以这么写:   //i键快速切换搜狗输入法皮肤//但是使用swap会有很多重载函数 推荐使用不和swap重名的函数Myswap(arr[i],arr[j]);}}}
}void test01()
{//注:或者使用sizeof(数组名)/sizeof(数组的数据类型) 得到长度//对int数组进行排序  int a[5] = { 1,3,2,8,4 };sort(a, 5);for (int i = 0; i < 5; i++){cout << a[i] << " " ;}cout << endl;//对字符数组进行排序char b[5] = { 'a','v','d','y','i'};//"awaf";//注意:写成后者的形式最后要加上'\0'的空间sort(b, 5);for (int i = 0; i < 5; i++){cout << b[i] << " ";}cout << endl;//对double进行排序double c[5] = {1.234,457457,23.54,23.33,56.54,};sort(c, 5);for (int i = 0; i < 5; i++){cout << c[i] << " ";}cout << endl;}int main() 
{//只需要开辟一个数组即可 结果存放在txt->excel中 当循环次数足够大时 消除全部重复的结果即可// 输出结果  //int* p = new int[16];//std::cout << "Total unique configurations: "  << std::endl;//delete [] p;test01();return 0;
}

输出结果:

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

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

相关文章

JNPF全新V5.0版本!重磅升级——APP篇

尊敬的JNPF用户们&#xff1a; 我们非常高兴地宣布&#xff0c;经过团队数月的辛勤努力和不断的技术创新&#xff0c;JNPF快速开发平台终于迎来了里程碑式的全新升级——V5.0版本&#xff01;这一版本的更新发布&#xff0c;不仅代表着我们技术实力的进一步提升&#xff0c;是…

Office Tool Plus部署、激活

1、下载安装&#xff0c;安装图片红色数字操作步骤 2、安装完成&#xff0c;激活&#xff0c;点击新手教程 找到相关教程 复制链接&#xff0c;在Office Tool Plus激活

Prometheus 监控 Nginx

作者&#xff1a;琉璃 一、Nginx_exporter安装 下载链接&#xff1a; https://github.com/discordianfish/nginx_exporter 下载nginx_exporter的docker镜像。 ocker pull fish/nginx-exporter先run一下&#xff0c;执行之后&#xff0c;会hold住&#xff0c;先不要关闭窗口…

THS6011容器版docker使用说明(by why+lqw)

THS6011容器版有分x86和arrch64两种安装包&#xff0c;主要是针对ths节点&#xff0c;本身并没有控制台的安装包&#xff0c;请根据自己的系统的cpu架构进行选择&#xff0c;本次使用的是x86的安装包作为演示。 下图是arrch64的镜像&#xff08;PDMP-4980&#xff09;&#xf…

Codeforces Round 962 (Div. 3)

前言 势必要拿下的一场比赛&#xff0c;最后结果也算如愿。 Standings&#xff1a;300 重新回到蓝名了&#xff0c;也完成了之前 “ 早日在比赛切掉 6 题 ” 的期望。 题目链接&#xff1a;Dashboard - Codeforces Round 962 (Div. 3) - Codeforces A. Legs 第一次在第一分钟就…

Segment Anything Model 2:使用Ultralytics框架进行SAM2图像分割

Segment Anything Model 2&#xff1a;使用Ultralytics框架进行SAM2图像分割 前言相关介绍前提条件实验环境安装环境项目地址LinuxWindows 使用Ultralytics框架进行SAM2图像分割参考文献 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩内容…

Vue进阶之Vue无代码可视化项目(九)

Vue无代码可视化项目—补充内容 背景介绍、方案设计Canvas Table创建一个新的vue项目普通表格的效果Canvas上手Canvas画表格-画基本表格CanvasTable处理事件系统CanvasTable表格滚动Vue组件封装思想拖拽组件 —smooth-dndDndDemo1.vueDndContainer.jsCanvasTable封装CanvasTabl…

运维工作中的事件、故障排查处理思路

一、运维工作中的事件 https://www.51cto.com/article/687753.html 二、运维故障排查 一&#xff09;故障排查步骤 1、明确故障 故障现象的直接表现故障发生的时间、频率故障发生影响哪些系统故障发生是否有明确的触发条件   故障举例&#xff1a;无法通过ssh登录系统 影响…

nginx 离线版本升级-停机

1. 最新版本下载 地址&#xff1a;https://nginx.org/en/download.html 2. 查看当前安装信息&#xff1a; which nginx (我获取的地址为/usr/local/nginx&#xff0c;之后用nginx-path代替) 2. 备份nginx执行文件 cp nginx-path/sbin/nginx nginx-path/sbin/nginx.bak …

redis的性能管理、主从复制和哨兵模式

redis的性能管理、主从复制和哨兵模式 一、redis的性能管理 redis的数据时缓存在内存中的 查看系统内存情况 info memory used_memory:853688 redis中数据占用的内存 used_memory_rss:10522624 redis向操作系统申请的内存 used_memory_peak:853688 redis使用内存的峰值 …

你看不上的“垃圾”——别人的赚钱“利器”

首先说一点&#xff0c;你认为是常识性的东西&#xff0c;也许还有4亿中国人不知道。 其次&#xff0c;你认为是遍地都有的、你看不上的、你瞧不起的这些“破烂玩意”&#xff0c;别人也许正拿来赚钱&#xff01; 不可思议吧&#xff0c;事实就是如此。 我在老家&#xff0c;…

word打印---doc转html后进行打印,window.print、print-js、vue-print-nb

提示&#xff1a;word预览方式—插件 文章目录 [TOC](文章目录) 前言一、vue-office-docx把docx转换html二、调取window.print三、print-js四、vue-print-nb总结 前言 word预览 一、vue-office-docx把docx转换html npm install vue-office-docx -S-DofficeDocx.vue <templ…

Python爬虫知识体系-----Selenium

数据科学、数据分析、人工智能必备知识汇总-----Python爬虫-----持续更新&#xff1a;https://blog.csdn.net/grd_java/article/details/140574349 文章目录 一、安装和基本使用二、元素定位三、访问元素信息四、自动化交互五、PhantomJS六、Chrome headless 一、安装和基本使用…

html+css 实现左平移背景按钮

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享htmlcss 绚丽效果&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 文…

计网面试题

OSI七层模型 物理层&#xff0c;数据链路层&#xff0c;网络层&#xff0c;传输层&#xff0c;会话层&#xff0c;表示层&#xff0c;应用层 应用层&#xff08;Application Layer&#xff09;&#xff1a;这是网络体系结构中的最顶层&#xff0c;提供用户接口和应用程序之间的…

Mosh|SQL教程第六弹

一、视图 1、创建视图CREATE VIEW viewname AS 这样就可以在左侧导航栏看到新增的view了&#xff0c;如果没有的话刷新一下就好了 可以把视图当表格使用 或者 注意&#xff1a;视图不存储数据&#xff0c;数据存储在表中 练习&#xff1a;创建一个视图&#xff0c;叫做客户结…

常用传感器讲解十五--触摸传感器(KY-036)

常用传感器讲解十五–触摸传感器&#xff08;KY-036&#xff09; 具体讲解 这个比较简单&#xff0c;就是触摸后给个信号 电路连接 在Arduino上将VCC引脚连接到5V。 将GND连接到Arduino的GND。 将OUT连接到Arduino上的D2 代码实现 void setup() {pinMode(2, INPUT);Seri…

Python数值计算(1)——Numpy中数据的保存和加载

这里讨论一下在进行数值计算中&#xff0c;对计算数据的保存和加载。 1. 文本格式 这种方式可以采用文本的方式保存numpy数组&#xff0c;函数原型如下&#xff1a; numpy.savetxt(fname, X, fmt%.18e, delimiter , newline\n, header, footer, comments# , encodingNone) …

.NET 一款反序列化打入冰蝎内存马的工具

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

开源项目的发展趋势,以及参与开源项目可以获得的经验和成果,以及涉及到的注意事项

目录 一、当前开源项目的发展趋势 1. 全球化协作与社区增长 2. 多领域技术创新与迭代加速 3. 开放协作模式 4. 商业化与产业融合 5. 安全性与隐私保护 6. 跨界融合与生态构建 7. 政策支持 二、参与开源项目的经验和收获 1. 技术能力提升 2. 团队协作与沟通能力 3.领…