排序函数c++函数模板实现

2023-11-08

冒泡排序、插入排序、选择排序、归并排序、快排、堆排序

冒泡排序、插入排序、选择排序,这种简单的时间复杂度是O(n2)

归并排序、快排、堆排序时间复杂度O(nlogn)

#include <iostream>

using namespace std;
template<class type> void arr_show(type arr[],int L,int R);
template<class type> void sort_bubble(type arr[],int L,int R)//冒泡排序排数组arr[L,R) 左闭右开
{
    for(int i=R-1;i>L;i--)
    {
        for(int j=L;j<i;j++)
        {
            if(arr[j]>arr[j+1])swap(arr[j],arr[j+1]);
        }
    }
}
template<class type> void sort_insert(type arr[],int L,int R)//插入排序
{
    for(int i=L+1;i<R;i++)//从L+1 到R-1的数都要向前找对应位置
    {
        for(int j=i-1;j>=L;j--)
        {
            if(arr[j]>arr[j+1])swap(arr[j],arr[j+1]);
            else break;
        }
    }
}
template<class type> void sort_choice(type arr[],int L,int R)//选择排序
{
    //从待选序列选出最小的放在生成序列最后面
    //简单来说就是依次选出最小的放在位置L L+1 L+2 ...R-2
    for(int i=L;i<R-1;i++)//放在i位置
    {
        int MIN=arr[i];//先假定arr[i]是目前最小的数
        int MIN_index=i;//记录最小数的下标
        for(int j=i+1;j<R;j++)//遍历带选择序列【i+1 R-1】
        {
            if(arr[j]<MIN)
            {
                MIN=arr[j];
                MIN_index=j;
            }
        }
        swap(arr[i],arr[MIN_index]);//把最小的数放在i位置  i位置得数放在待选则序列中
    }
}
template<class type> void sort_merge(type arr[],int L,int R)//归并排序
{
    if(R-L<=1)return;//不够两个元素不需要排
    int middle=(R+L)/2;
    sort_merge(arr,L,middle);
    sort_merge(arr,middle,R);
    //开始归并(merge)
    type *box=new type[R-L];//开辟与原数组相同大小的空间
    int arrow1=L;
    int arrow2=middle;
    int I=0;
    while(arrow1<middle && arrow2<R)
    {
        box[I++]=arr[arrow1]<arr[arrow2]?arr[arrow1++]:arr[arrow2++];
    }
    while(arrow1<middle)
    {
        box[I++]=arr[arrow1++];
    }
    while(arrow2<R)
    {
        box[I++]=arr[arrow2++];
    }
    //复制回去
    for(int i=L;i<R;i++)
    {
        arr[i]=box[i-L];
    }
    delete[] box;
}
template<class type> void sort_quick(type arr[],int L,int R)//快排
{
    if(R-L<=1)return;
    int r1=L;   //小于区域 【L,r1)
    int r2=R;   //大于区域 【r2,R)
    int num=arr[L]; //把arr[L]当做基准数
    int i=L;
    while(i<r2) //
    {
        if(arr[i]<num)
        {
            swap(arr[i++],arr[r1++]);
        }
        else if(arr[i]>num)
        {
            swap(arr[--r2],arr[i]);
        }
        else i++;
    }
    sort_quick(arr,L,r1);
    sort_quick(arr,r2,R);
}
template<class type>
class heap
{
private:
    type *H;
    int length;
    int now_size;
public:
    heap(type arr[],int L,int R):length(R-L)//建大顶堆
    {
        H=new type[length];
        for(int i=0;i<length;i++)
        {
            H[i]=arr[L+i];
            adjust_up(i);
        }
    }
    ~heap()
    {
        delete[] H;
    }
    void sort_myheap()
    {
        now_size=length;
        for(int i=length-1;i>0;i--)
        {
            swap(H[0],H[i]);//依次将堆顶元素与堆最后一个元素交换
            now_size--;
            adjust_down(0); //堆顶元素向下调整
        }
    }
    void adjust_down(int loc)
    {
        int max_index;
        while(loc*2+1<now_size)
        {
            if(loc*2+2<now_size && H[loc*2+2]>H[loc*2+1])max_index=loc*2+2;
            else max_index=loc*2+1;
            if(H[max_index]>H[loc])
            {
                swap(H[max_index],H[loc]);
                loc=max_index;
            }
            else break;
        }
    }
    void adjust_up(int locate)
    {
        while(H[(locate-1)/2]<H[locate])
        {
            swap(H[(locate-1)/2],H[locate]);
            locate=(locate-1)/2;
        }
    }

    void paste(type arr[],int L)
    {
        for(int i=0;i<length;i++)
        {
            arr[L+i]=H[i];
        }
    }
    int get_length(){return length;}
};
template<class type> void sort_myheap(type arr[],int L,int R)//堆排序
{
    heap<int> Heap(arr,L,R);
    Heap.sort_myheap();
    Heap.paste(arr,L);
}
template<class type> void arr_show(type arr[],int L,int R) //打印数组arr[L,R)的值
{
    for(int i=L;i<R;i++)
    {
        cout<<arr[i]<<" ";
    }
    cout<<endl;
}

int main()
{
    int arr[10]={4,5,1,3,6,9,7,8,5,0};
    int arr2[10]={4,5,1,3,6,9,7,8,5,0};
    int arr3[10]={4,5,1,3,6,9,7,8,5,0};
    int arr4[10]={4,5,1,3,6,9,7,8,5,0};
    int arr5[10]={4,5,1,3,6,9,7,8,5,0};
    int arr6[10]={4,5,1,3,6,9,7,8,5,0};
    sort_bubble(arr,0,sizeof(arr)/sizeof(int));
    arr_show(arr,0,10);
    sort_insert(arr2,0,sizeof(arr)/sizeof(int));
    arr_show(arr2,0,10);
    sort_choice(arr3,0,sizeof(arr)/sizeof(int));
    arr_show(arr3,0,10);
    sort_merge(arr4,0,sizeof(arr4)/sizeof(int));
    arr_show(arr4,0,sizeof(arr4)/sizeof(int));
    sort_quick(arr5,0,sizeof(arr5)/sizeof(int));
    arr_show(arr5,0,sizeof(arr5)/sizeof(int));
    sort_myheap(arr6,0,sizeof(arr6)/sizeof(int));
    arr_show(arr6,0,sizeof(arr6)/sizeof(int));
    return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

排序函数c++函数模板实现 的相关文章

  • 为什么在连接两个字符串时 Python 比 C 更快?

    目前我想比较 Python 和 C 用来处理字符串的速度 我认为 C 应该比 Python 提供更好的性能 然而 我得到了完全相反的结果 这是 C 程序 include
  • CLR 2.0 与 4.0 性能比较?

    如果在 CLR 4 0 下运行 为 CLR 2 0 编译的 NET 程序会运行得更快吗 应用程序配置
  • 适合初学者的良好调试器教程[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有谁知道一个好的初学者教程 在 C 中使用调试器 我感觉自己好像错过了很多 我知道怎么做 单步执行代码并查看局部变量 虽然这常常给我带来问
  • 代码 GetAsyncKeyState(VK_SHIFT) & 0x8000 中的这些数字是什么?它们是必不可少的吗?

    我试图在按下按键的简单动作中找到这些数字及其含义的任何逻辑解释 GetAsyncKeyState VK SHIFT 0x8000 可以使用哪些其他值来代替0x8000它们与按键有什么关系 GetAsyncKeyState 根据文档返回 如果
  • 如何填充 ToolStripComboBox?

    我发现它很难将数据绑定到ToolStripComboBox 好像没有这个ValueMember and DisplayMember特性 怎么绑定呢 访问toolstripcombobox中包装的组合框并访问其ValueMember Disp
  • 从同一个类中的另一个构造函数调用构造函数

    我有一个带有两个构造函数的类 C 这是代码片段 public class FooBar public FooBar string s constructor 1 some functionality public FooBar int i
  • 对 std::vector 进行排序但忽略某个数字

    我有一个std vector
  • Python 属性和 Swig

    我正在尝试使用 swig 为一些 C 代码创建 python 绑定 我似乎遇到了一个问题 试图从我拥有的一些访问器函数创建 python 属性 方法如下 class Player public void entity Entity enti
  • C# 存档中的文件列表

    我正在创建一个 FileFinder 类 您可以在其中进行如下搜索 var fileFinder new FileFinder new string C MyFolder1 C MyFolder2 new string
  • 类型约束

    我有以下类层次结构 class Header IEnumerable
  • 识别 Visual Studio 中的重载运算符 (c++)

    有没有办法使用 Visual Studio 快速直观地识别 C 中的重载运算符 在我看来 C 中的一大问题是不知道您正在使用的运算符是否已重载 Visual Studio 或某些第三方工具中是否有某些功能可以自动突出显示重载运算符或对重载运
  • 使用valgrind进行GDB远程调试

    如果我使用远程调试gdb我连接到gdbserver using target remote host 2345 如果我使用 valgrind 和 gdb 调试内存错误 以中断无效内存访问 我会使用 target remote vgdb 启动
  • 在 NaN 情况下 to_string() 可以返回什么

    我使用 VS 2012 遇到了非常令人恼火的行为 有时我的浮点数是 NaN auto dbgHelp std to string myFloat dbgHelp最终包含5008角色 你不能发明这个东西 其中大部分为0 最终结果是 0 INF
  • 如何在 C 中安全地声明 16 位字符串文字?

    我知道已经有一个标准方法 前缀为L wchar t test literal L Test 问题是wchar t不保证是16位 但是对于我的项目 我需要16位wchar t 我还想避免通过的要求 fshort wchar 那么 C 不是 C
  • 在mysql连接字符串中添加应用程序名称/程序名称[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在寻找一种解决方案 在连接字符串中添加应用程序名称或程序名称 以便它在 MySQL Workbench 中的 客户端连接 下可见 SQL
  • 等待 IAsyncResult 函数直至完成

    我需要创建等待 IAsyncResult 方法完成的机制 我怎样才能做到这一点 IAsyncResult result contactGroupServices BeginDeleteContact contactToRemove Uri
  • Unity:通过拦截将两个接口注册为一个单例

    我有一个实现两个接口的类 我想对该类的方法应用拦截 我正在遵循中的建议Unity 将两个接口注册为一个单例 https stackoverflow com questions 1394650 unity register two inter
  • C++ new * char 不为空

    我有一个问题 我在 ASIO 中开发服务器 数据包采用尖头字符 当我创建新字符时 例如char buffer new char 128 我必须手动将其清理为空 By for int i 0 i lt 128 i buffer i 0x00
  • String.Empty 与 "" [重复]

    这个问题在这里已经有答案了 可能的重复 String Empty 和 有什么区别 https stackoverflow com questions 151472 what is the difference between string
  • 为boost python编译的.so找不到模块

    我正在尝试将 C 代码包装到 python 中 只需一个类即可导出两个函数 我编译为map so 当我尝试时import map得到像噪音一样的错误 Traceback most recent call last File

随机推荐

  • C#串口通信三步走

    第一步 实例化串口通讯类 SerialPort sp new SerialPort 第二步 设置串口信息并打开串口 串口设置 public void SetSP string PortName string BaudRate string
  • 项目开发总结报告(GB8567——88)(转载)

    项目开发总结报告 GB8567 88 1引言1 1编写目的说明编写这份项目开发总结报告的目的 指出预期的阅读范围 1 2背景说明 a 本项目的名称和所开发出来的软件系统的名称 b 此软件的任务提出者 开发者 用户及安装此软件的计算中心 1
  • unity3D 巡逻兵

    游戏要求 创建一个地图和若干巡逻兵 使用动画 每个巡逻兵走一个3 5个边的凸多边型 位置数据是相对地址 即每次确定下一个目标位置 用自己当前位置为原点计算 巡逻兵碰撞到障碍物 则会自动选下一个点为目标 巡逻兵在设定范围内感知到玩家 会自动追
  • UPC思维题--移动

    题目描述 考虑333的立方体 有六个面 每个面有九个正方形 染色方法如下 角上的方格是red 中心是green 其他为blue 初始有一个机器人站在立方体顶面中心 面朝一个blue方格 它将接受到一系列如下指令 L 左转90度 R 右转90
  • gzip 命令

    NAME gzip compression decompression tool using Lempel Ziv coding LZ77 SYNOPSIS gzip cdfhkLlNnqrtVv S suffix file file gu
  • SQL Server连接字符串句法

    Application Name 应用程序名称 应用程序的名称 如果没有被指定的话 它的值为 NET SqlClient Data Provider 数据提供程序 AttachDBFilename extended properties 扩
  • ts总结 之 ts中的类型

    其他内容 ts中的类型 编译选项 webpack打包 类 文章目录 ts是什么 ts增加了什么 TypeScript中的基本类型 字面量 number boolean string any unknown 类型断言 void never o
  • (一)(C语言)实现顺序表(静态分配)的基本操作(初始化、判断是否为空,打印表,插入和删除等)讲解(含相关C语言代码讲解及运行结果)

    一 C语言 实现顺序表 静态分配 的基本操作 初始化 查找 打印表 插入和删除等 讲解 含C语言完整代码讲解及运行结果 文章目录 一 顺序表 二 顺序表相关操作 1 初始化 2 插入 3 删除 4 打印表 5 查找 三 完整代码讲解 C语言
  • 如何在chrome浏览器调试JS代码

    文章目录 资源 Sources 面板 控制台 Console 断点 Breakpoints debugger 命令 暂停并查看 日志记录 总结 参考文献 在编写更复杂的代码前 让我们先来聊聊调试吧 调试是指在一个脚本中找出并修复错误的过程
  • 如何解决merge conflict的方法

    如何解决merge conflict的方法 首先在pull的时候加上rebase 解决conflict 最后push git pull rebase origin remote if there is conflict clean it a
  • 3月份的字节跳动面经

    本人2本毕业 目前工作四年 一直是Android 做的都是些二线公司 没做过一线 四年跳了三家公司 在家休息了几个月 今年3月份开始面试 由于跳槽过多而且已经是现在Android市场的原因 内推的我的字节哥们儿 推了不知道多少个部门 才把我
  • Python轻松搞定免费语音合成,利用百度AI为短视频配音

    1 创建百度AI账号 1 1 点击进入百度AI 左上角 开放能力 gt 语音合成 gt 立即使用 如果是试用 可以直接点击在线语音合成 不过语音不能下载 要下载还得用下面方式 调用百度AI的API 1 2 然后登录百度云账户 进入管理中心
  • qemu-virtio基本原理

    virtio是相当复杂的 网上写virtio原理解析的文章也不少 这里我想通过最简练易懂的方式来解释一下virtio的原理 一方面也完善一下自己对virtio的理解 文中含有大量个人理解 如果发现有错误的地方欢迎与我交流 virtio整体流
  • 掌财社:掌握CCI指标捕捉爆发牛股

    什么是CCI指标 CCI指标又叫顺势指标 其英文全名为 Commodity Channel Index 是由美国股市分析家唐纳德R 兰伯特 Donald r Lambert 于20世纪80年代所创 是指导股市投资的一种中短线指标 CCI指标
  • linuxas3+apache2+mysql5+php5+discuz5+zend3.3+supesite.docx

    最近领导要装个supesite discuz 方便公司内部用 对于公司内部用来说是大了点 感觉有些大财小用了 但如果考虑以后做成门户 还是很值得的 于是就动手配置 出于linux系统的稳定与安全 选择linux作为平台 本配置所用系统与软件
  • 认识glBegin

    初学OpenGL的时候总有很多函数或者函数的参数不会用 不明白其作用 今天主要总结一下关于glBegin 中的参数用法 一 glBegin glBegin表示一组用于定义一个或者多个图元的顶点的开始 此函数通常与glEnd函数联用 在glB
  • 深度学习中常见的loss函数汇总

    损失函数 Loss Function 分为经验风险损失函数和结构风险损失函数 经验风险损失函数反映的是预测结果和实际结果之间的差别 结构风险损失函数则是经验风险损失函数加上正则项 L1或L2 深度学习中的损失函数被用于模型参数的估计 通常作
  • SpringBoot (6)- 自定义Starter

    SpringBoot 6 自定义Starter 1 简介 1 1启动器starter命名 1 2什么是SpringBoot starter机制 1 3为什么要自定义starter 1 4什么时候需要创建自定义starter 1 5自动加载核
  • Matlab——图像缩放(插值法)

    实验内容 用双线性内插法实现位深度为8的灰度图像的缩放 思路 输入原图像以及缩放后图像的像素要求 宽度 高度 处理后输出新图像 我是用matlab来实现scale input img scale size 函数的 输入图像路径以及要求实现的
  • 排序函数c++函数模板实现

    冒泡排序 插入排序 选择排序 归并排序 快排 堆排序 冒泡排序 插入排序 选择排序 这种简单的时间复杂度是O n2 归并排序 快排 堆排序时间复杂度O nlogn include