排序函数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++函数模板实现 的相关文章

  • 编译时运算符

    有人可以列出 C 中可用的所有编译时运算符吗 C 中有两个运算符 无论操作数如何 它们的结果始终可以在编译时确定 它们是sizeof 1 and 2 当然 其他运算符的许多特殊用途可以在编译时解决 例如标准中列出的那些整数常量表达式 1 与
  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • 按成员序列化

    我已经实现了template
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • Asp.NET WebApi 中类似文件名称的路由

    是否可以在 ASP NET Web API 路由配置中添加一条路由 以允许处理看起来有点像文件名的 URL 我尝试添加以下条目WebApiConfig Register 但这不起作用 使用 URIapi foo 0de7ebfa 3a55
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写

随机推荐

  • 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