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

news2024/9/27 7:21:16

目录

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.coloradmin.cn/o/1970924.html

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

相关文章

HCIE还是CCIE?高级认证到底要怎么选?

HCIE与CCIE&#xff0c;作为网络技术领域的两大旗舰认证&#xff0c;一直是IT专业人士追求的目标。 它们不仅代表了个人技术能力的权威认可&#xff0c;更是职业生涯中的重要里程碑。 然而&#xff0c;面对这两个同为高级认证的金字招牌&#xff0c;许多人不禁要问&#xff1a;…

基于FPGA的数字信号处理(21)--超前进位加法器

目录 1、什么是超前进位加法器 2、CLA加法器的关键路径 3、CLA加法器的Verilog实现 4、CLA加法器的时序性能 5、总结 文章总目录点这里&#xff1a;《基于FPGA的数字信号处理》专栏的导航与说明 1、什么是超前进位加法器 在之前的文章&#xff0c;我们介绍了行波进位加法器…

安装linux系统的时候没有允许root用户远程登录,怎么修改?

1、进入/etc/ssh/sshd_config vim /etc/ssh/sshd_config /etc/ssh/sshd_config通常是 SSH 服务&#xff08;Secure Shell&#xff09;的配置文件。 SSH 是一种用于安全远程登录和执行命令的网络协议。在这个配置文件中&#xff0c;您可以设置诸如端口号、允许或拒绝的登录用户…

数据结构(5.4_1)——树的存储结构

树的逻辑结构 双亲表示法(顺序存储) 每个结点中保存指向双亲的“指针” #define MAX_TREE_SIZE 100//树中最多结点typedef struct {//树的结点定义int data;//数据元素int parent;//双亲位置域 }PTNode; typedef struct {//树的类型定义PTNode nodes[MAX_TREE_SIZE];//双亲表…

红外热成像手持终端:从建筑检测到野外搜救的全方位应用

红外热成像手持终端&#xff0c;凭借其独特的红外探测与夜视功能&#xff0c;广泛应用于多个关键领域。无论是军事侦察、消防救援中的夜间作业&#xff0c;还是电力巡检、野生动物观察等多样场景&#xff0c;其精准的红外热成像技术均能提供至关重要的实时数据&#xff0c;助力…

TrainingArguments 的ignore_data_skip解释

文章目录 0. 背景1. 官方解释2. 查看源码3. 验证4. 总结 0. 背景 在采用 HuggingFace 提供的 Transformers 库来训练模型时&#xff0c;如果出现模型训练中断的情况&#xff0c;此时我们希望断点接训&#xff0c;TraningArguments 有一个参数&#xff1a;resume_from_checkpoi…

都从哪里下载量产工具,我给大家推荐一下吧

就推荐量产部落&#xff01;因为从事固态硬盘维修这行&#xff0c;而且我自己也喜欢DIY&#xff0c;所以我比较关注量产工具下载。 要说量产工具&#xff0c;就得从U盘和固态硬盘的兴衰开始说起&#xff0c;从2016年开始&#xff0c;U盘就在走下坡路了&#xff0c;U盘量产工具…

英特尔裁员、暂停分红和市场挑战

英特尔&#xff08;INTC&#xff09;近日宣布了一系列战略调整&#xff0c;以应对其面临的严峻挑战。这家总部位于加利福尼亚州圣克拉拉的芯片制造商计划裁员超过15%&#xff0c;并从第四季度起暂停派息&#xff0c;以重振其盈利能力。 股价暴跌与市值蒸发 英特尔的这一决定导…

找不到的软件资源,试试这个网站

0daydown是一个提供多种资源下载的网站&#xff0c;包括软件、电影、音乐和游戏等。该网站通常会转载其他0day站点或PT站点的内容&#xff0c;并以其丰富的资源和便捷的下载方式而闻名。此外&#xff0c;0daydown还收录了稀缺的0day软件&#xff0c;并提供百度网盘下载链接。 …

双 Token 三验证解决方案

更好的阅读体验 \huge{\color{red}{更好的阅读体验}} 更好的阅读体验 问题分析 以往的项目大部分解决方案为单 token&#xff1a; 用户登录后&#xff0c;服务端颁发 jwt 令牌作为 token 返回每次请求&#xff0c;前端携带 token 访问&#xff0c;服务端解析 token 进行校验和…

serial---- vulnhub打靶

1.新建虚拟机&#xff0c;虚拟硬盘使用vulnhub下载提供的虚拟硬盘文件 2.打开虚拟机&#xff0c;扫描网段&#xff0c;确定IP(或者arp -a) 3.发现没有robots.txt&#xff0c;以及一些常见admin,www.zip目录文件&#xff0c;尝试扫目录 拿另一个工具扫一下看看多了一个 4.发现备…

凸优化学习之旅

目录标题 专业名词MM算法CCP算法&#xff1a;代码说明 SCA算法&#xff1a;连续松弛梯度投影算法 分支定界搜索法凸问题辨别OA算法λ-representationADMM算法代码说明 BCD算法BCD&#xff08;Block Coordinate Descent&#xff09;代码示例与ADMM的区别总结 2024年5月6日15:15:…

2024 年 5 款顶级的免费和付费 PDF 编辑器个人评测

PDF 为企业、学校或一般用途提供了一种共享各种信息的便捷方式。您可以在笔记本电脑和智能手机上轻松查看 PDF 文档。但大多数图片查看器和 PDF 阅读器不允许您编辑 PDF。因此&#xff0c;当您想要修改 PDF 文件中的图像或文本时&#xff0c;您需要一个PDF 编辑器。 似乎没有太…

springboot高校勤工俭学平台-计算机毕业设计源码66824

摘 要 本研究基于Spring Boot企业框架&#xff0c;设计并实现了一款高校勤工俭学平台&#xff0c;包括首页、通知公告、新闻通知和岗位信息等功能模块。该平台旨在为高校学生提供便捷的勤工俭学信息发布与查询服务&#xff0c;促进校园内部劳动力资源的充分利用和高效管理。在研…

MSTR:智慧无处不在,可信任 AI 的崛起

|| 前言 商业智能&#xff08;BI&#xff09;的力量在于利用数据得出可行的洞察&#xff0c;从而做出更明智的数据驱动决策。从提升内部产品质量、运营和资源利用&#xff0c;到简化公共服务&#xff0c;BI应用非常多样化又具有影响力。 引入人工智能&#xff08;AI&#xff…

Vue+SpringBoot+SpringSecurity项目对于跨域的深度理解

随记&#xff08;可跳过&#xff09;&#xff1a;CodeMan在熬夜肝一周SpringSecurity学习的时候&#xff0c;总是报错&#xff0c;于是冥思苦想&#xff0c;选择了询问Ai&#xff0c;但是不论怎么设置权限&#xff0c;接口仍然无法按所设想的权限被调用&#xff0c;于是在今天的…

这“听说啊”的想法很美感

《澎湃新闻》今天在发表的长文《“第二个香港”即将诞生&#xff01;面积比香港大30倍&#xff0c;或成最大自由港》中称&#xff1a;“听说啊&#xff0c;2024年海南会在合适的时候启动全岛封关运作&#xff0c;这意味着海南要建成更自由、更开放的自由贸易港&#xff0c;咱们…

如何在 Debian 上安装运行极狐GitLab Runner?【二】

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门面向中国程序员和企业提供企业级一体化 DevOps 平台&#xff0c;用来帮助用户实现需求管理、源代码托管、CI/CD、安全合规&#xff0c;而且所有的操作都是在一个平台上进行&#xff0c;省事省心省钱。可以一键安装极狐GitL…

亲子游戏 - 华为OD统一考试(D卷)

OD统一考试(D卷) 分值: 200分 题解: Java / Python / C++ 题目描述 宝宝和妈妈参加亲子游戏,在一个二维矩阵(N*N)的格子地图上,宝宝和妈妈抽签决定各自的位置,地图上每个格子有不同的糖果数量,部分格子有障碍物。 游戏规则是妈妈必须在最短的时间(每个单位时间只能走…

PythonPDF操作库之pdfminer使用详解

概要 在现代信息处理领域,PDF 文件是常见的文档格式之一。无论是在企业应用还是个人使用中,能够有效地提取和处理 PDF 文档内容是一项重要技能。pdfminer 是一个强大的 Python 库,专注于从 PDF 文件中提取文本和信息。本文将详细介绍 pdfminer 库,包括其安装方法、主要特性…