<学习笔记>排序模板

[C++]排序模板(含C++模板代码) 排序模板一、插入排序 特点:stable sort、In-place sort 最优复杂度:当输入数组就是排好序的时候,复杂度为O(n),而快速排序在这种情况下会产生O(n^2)的复杂度。 最差复杂度:当输入数组为倒序时,复杂度为O(n^2) 插入排序比较适合用于“少量元素的数组”。 伪代码:C++模板:template <typename T> void Insertion_Sort(T *arr 阅读详情

*PS:整理自小蓝课件qwq

选择排序

基本思想:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在待排序的数列的最前,直到全部待排序的数据元素排完

优:稳定
缺:慢

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;

int n;
int a[100010];

void SelectSort()
{
    for(int i=1;i<n;++i)
    {
        int k=i;
        for(int j=i+1;j<=n;++j)
           if(a[j]<a[k]) k=j;
        if(k!=i) swap(a[i],a[k]);
    }
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;++i)
      scanf("%d",&a[i]);
    SelectSort();
    for(int i=1;i<=n;++i)
      printf("%d ",a[i]);
    return 0;
}

冒泡排序

从1到n依次比较相邻的两个数,把大的放前面,小的放后面。第一遍排序结束时,最小的一定排到最后。重复上述过程,仍从第1个数开始交换,直到交换到倒数第2个数……
由于在排序过程中总是大数往前,小数往后,相当气泡上升,所以叫冒泡排序。
优化:设置一个bool变量判断当前有无排好序。

优:稳定
缺:慢

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;

int n;
int a[100010];

void Sort()
{
     int l=n;
     bool change;
     do
     {
         change=false;
         for(int i=1;i<l;++i)
           if(a[i]<a[i+1]) 
           {
               swap(a[i],a[i+1]);
               change=true;
           }
         --l;    
     }while(change);
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;++i)
      scanf("%d",&a[i]);
    Sort();
    for(int i=1;i<=n;++i)
      printf("%d ",a[i]);
    return 0;
}

桶排序

思想:若待排序的记录的关键字在一个明显有限范围内(整型)时,可设计有限个有序桶,每个桶装入一个值(当然也可以装入若干个值),顺序输出各桶的值,将得到有序的序列。

优:思想简单,代码容易实现
缺:排序的数字小。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;

int n,k;
int a[1010];

int main()
{
     scanf("%d",&n);
     for(int i=1;i<=n;i++)  
     {
         scanf("%d",&k);   
         ++a[k];                
     }
     for(int i=0; i<=1000;i++) 
     while(a[i]>0)  
     {  
         printf("%d ",a[i]);
         --a[i];
     }    
     return 0;
}

插入排序

思想:维护有序区1~i,每次插入第i+1个元素并维护有序性,直到1~n变为一个有序区。其算法的时间复杂性为O(n2)插入排序适用于原先数据已经排列好,插入一个新数据的情况。

优:
缺:慢。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;

int n;
int a[100010];

void InsertSort()
{
    for(int i=2;i<=n;++i)
    {
        int k=a[i],j=i-1;
        while(k<a[j])
        {
            a[j+1]=a[j];
            --j;
        }
        a[j+1]=k;
    }
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;++i)
      scanf("%d",&a[i]);
    InsertSort();
    for(int i=1;i<=n;++i)
      printf("%d ",a[i]);
    return 0;
}

快速排序

快速排序是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。O(nlog2n)。

优:速度快
缺:不稳定

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;

int n;
int a[100010];

void qsort(int L,int R)
{
    int l=L,r=R;
    int k=a[(l+r)>>1];
    while(l<=r) 
    {
        while(a[l]<k) ++l;
        while(a[r]>k) --r;
        if(l<=r) swap(a[l],a[r]),++l,--r;
    }
    if(l<R) qsort(l,R);
    if(L<r) qsort(L,r);
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;++i)
      scanf("%d",&a[i]);
    qsort(1,n);
    for(int i=1;i<=n;++i)
      printf("%d ",a[i]);
    return 0;
}

归并排序

将两个或两个以上有序的数列(或有序表),合并成一个仍然有序的数列(有序表),这种操作称为归并操作。这样的方法经常用于多个有序的数据文件归并成一个有序的数据文件。若将两个有序表合并成一个有序表则称为二路归并,同理,有三路归并、四路归并等。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;

int n;
int a[100010],b[100010];

void Done(int l,int mid,int r)
{
    int i=l,j=mid+1,k=l-1;
    while(i<=mid&&j<=r)
    {
        if(a[i]<a[j]) b[++k]=a[i],++i;
        else b[++k]=a[j],++j;
    }
    while(i<=mid) b[++k]=a[i],++i;
    while(j<=r)   b[++k]=a[j],++j;
    for(i=l;i<=r;++i)
      a[i]=b[i];
}
void MergeSort(int l,int r)
{
    if(l==r) return ;
    int mid=(l+r)>>1;
    MergeSort(l,mid);
    MergeSort(mid+1,r);
    Done(l,mid,r); 
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;++i)
      scanf("%d",&a[i]);
    MergeSort(1,n);
    for(int i=1;i<=n;++i)
      printf("%d ",a[i]);
    return 0;
}

堆排序

不断弹出堆顶元素。
(偷懒直接粘上堆的模板)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;

int N;
int a[100010];

void creat(int n)
{
    int k,f=1;
    while((n<<1)<=N&&f)
    {
        k=n;
        if((n<<1)<=N&&a[n<<1]<a[k]) k=n<<1;
        if((n<<1|1)<=N&&a[n<<1|1]<a[k]) k=n<<1|1;
        if(k!=n) swap(a[n],a[k]),n=k;
        else f=0; 
    }
}
void make()
{
    for(int i=N/2;i>=1;--i)
       creat(i); 
}
int ask_top()
{
    return a[1];
}
void pop()
{
    swap(a[1],a[N]),--N;
    creat(1);
}
bool empty()
{
    if(!N) return true;
    return false;
}
void Sort()
{
    int l=N;
    while(N) pop();
    for(int i=l;i>=1;--i)
      printf("%d ",a[i]);
}
int size()
{
    return N;
}
void push(int k)
{
    ++N;
    int n=N,f=1;
    a[n]=k;
    if(n==1) return; 
    while(n>1&&f)
    {
        if(a[n]<a[n>>1]) swap(a[n],a[n>>1]);
        else f=0;
        n>>=1; 
    }
    return;
}
int main()
{
   scanf("%d",&N);
   for(int i=1;i<=N;++i)
     scanf("%d",&a[i]);
   make();
   Sort();
   return 0;    
} 

STL

函数名功能描述
sort对给定区间所有元素进行排序
stable_sort对给定区间所有元素进行稳定排序
partial_sort对给定区间所有元素部分排序
partial_sort_copy对给定区间复制并排序
nth_element找出给定区间的某个位置对应的元素
is_sorted判断一个区间是否已经排好序
partition使得符合某个条件的元素放在前面
stable_partition相对稳定的使得符合某个条件的元素放在前面

各种排序算法的比较

  • 稳定性比较
    (排序的稳定性是指如果在排序的序列中,存在前后相同的两个元素的话,排序前和排序后他们的相对位置不发生变化)
    插入排序、冒泡排序、二叉树排序、归并排序及其他线形排序是稳定的。
    选择排序、希尔排序、快速排序、堆排序是不稳定的。
  • 时间复杂度比较
    插入排序、冒泡排序、选择排序的时间复杂性为O(n2);快速排序、堆排序、归并排序的时间复杂性为O(nlog2n);桶排序的时间复杂性为O(n);
    *在最好情况下,直接插入排序和冒泡排序最快;在平均情况下,快速排序最快;在最坏情况下,堆排序和归并排序最快。
C++排序类模板, 排序类 我的C++一直比较水,平时都用C写程序,今天想写一个排序类模板,练习一下。 希尔排序,快速排序,归并排序,选择排序,冒泡排序,堆排序,插入排序 #include #include #include template class sort { public: sort(int (*cmp)(Type t1, Type t2)); ~sort() {} void a 阅读详情

相关推荐

c++模板实现冒泡排序

c++模板实现的冒泡排序(vs2019) 模板实现的冒泡排序可以对任意数据类型的数据进行排序,这样节省了大量的时间去写重复的代码. 在此之前,我将交换任意数据类型的模板和打印任意数据类型数据的模板也写了出来,这样用起来很方便. 在这里插入代码片 #include<iostream> using namespace std; //交换两个数的模板 template<class T&...

clearloe的博客 1809

Maple中的sequence, set和list

在数学计算中,序列、集合与列表是最常用的几种基本数据类型。在Maple中,有相应的数据结构与之对应。本文就这几种数据结构在Maple的使用方法进行简要说明。

郝伟老师的博客——大数据、并行计算与人工智能时代 3050

选择排序实现链表排序与模板函数解析

本文介绍了如何使用选择排序算法对整数链表进行排序,并通过C++代码展示了具体的实现过程。此外,文章还深入探讨了模板函数的相关知识点,包括模板函数的目的、模板前缀的作用、参数匹配规则、实例化时机以及模板类实现中的注意事项。同时,还涉及了迭代器的使用、节点操作函数、数据类型泛化方法等内容,适用于C++编程中对数据结构与泛型编程的理解与应用。

971

冒泡排序

一、算法描述 冒泡排序:依次比较相邻的数据,将小数据放在前,大数据放在后;即第一趟先比较第1个和第2个数,大数在后,小数在前,再比较第2个数与第3个数,大数在后,小数在前,以此类推则将最大的数”滚动”到最后一个位置;第二趟则将次大的数滚动到倒数第二个位置……第n-1(n为无序数据的个数)趟即能完成排序。 以下面5个无序的数据为例: 40 8 15 18 12 (文中仅...

测试 407

c++模板实现快速排序

c++模板实现快速排序 1.什么是快速排序 快速排序(Quicksort)是对冒泡排序的一种改进。 快速排序由C. A. R. Hoare在1960年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 2快速排序实现过程 快速排序算法通过多次比较和交换来实现排序,其排序流程如下: (1)首先设定一个分界值,通过该分界值将数组分成左右两部分

weixin_45369669的博客 918

从透射谱到能量分布:用Rsoft破解光纤光栅耦合模式的3个关键技巧

本文面向光通信工程师与研究者,分享了利用Rsoft软件深入分析光纤光栅耦合模式的三个关键技巧。通过配置场监视器观察XY截面能量分布、利用传播动画追踪动态过程,并结合模式求解器精准判定相位匹配,帮助用户超越透射谱分析,直观可视化能量从纤芯到包层的耦合与流动,从而优化器件设计。

weixin_29290963的博客 420

九种常见排序的比较和实现

首先排序算法大的可以分为: 关键字比较 非关键字比较 关键字比较关键字比较就是通过关键字之间的比较和移动,从而使整个序列有序, 而关键字比较的算法,又可以像下面这样划分:对于排序算法之间的比较,无异于时间复杂度和空间复杂度,看下面这张表格 由上表不难得出下面这几个重要的点: 从平均时间性能而言,快速排序最佳,其所需时间最佳,但快速排序在最坏情况下的时间性能不如堆排序和归并排序。堆排序和归并之间,

Maple的博客 1090

【已解决】如何在服务器中下载huggingface模型,解决huggingface无法连接

在服务器上使用huggingface模型时,如果直接指定模型名称,用AutoTokenizer.from_pretrained(“model_name”),可能会由于网络原因会报错 Failed to connect to huggingface.co port 443 after 75018 ms: Operation time out因此我们需要下载模型到服务器上,得到模型本地的路径model_dir,再通过AutoTokenizer.from_pretrained(model_dir)方式来使用。

a61022706的博客 4万+

<1> 可视化排序

1.  简 要 概 述  VisualSort 是一种排序教学演示程序,演示程序使用 C++ / WinForm( .Net )语言开发,开发平台为 Microsoft Visual Studio2015 Community。演示程序实现了对任意交换排序算法的每一步比较和交换的可视化演示,并支持单步模式,可以执行单步的前进/回退操作。 2.  软 件 操 作 2.1 软件的基本介绍 如下

Charmain 698

逆向选择启示录:一个失败高频策略如何意外跑赢市场

本文探讨了高频交易中的逆向选择现象,揭示了一个失败的高频策略如何通过简化意外跑赢市场。通过加密货币市场的实证分析和蒙特卡洛模拟,研究发现低预测性的简单策略反而更具鲁棒性,有效规避了逆向选择风险。文章还提供了小币种做市策略的优化框架和实践建议,为量化交易者提供了宝贵洞见。

weixin_29191669的博客 401

ICC2 实战秘籍:create_workspace 命令全解析

必选项:工作区名称,这可是创建工作区的 “身份证”,必不可少。技术数据选项匹配:优先考虑用 -technology 直接加载技术文件,这是获取最新、最准确技术数据的首选路径;要是已经有合适的技术库了,那 -use_technology_lib 引用现有技术库也能快速上手。精度设置优先规则:技术文件自动配置排在第一位,能自动适配就别手动操心;要是自动配置不理想,那就显式指定 scale_factor;实在没要求,就用默认配置,但得清楚它的精度限制。

weixin_50820814的博客 1124

C++ 函数模板和排序的函数模板——学习笔记

我们在使用重载函数时,只是使用了函数名,而函数体还是得分别定义,在C++中函数模板为我们很好的解决了这个问题.1.函数模板的声明 函数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免重载函数的函数体重复设计。它的最大特点是把函数使用的数据类型作为参数。 函数模板的声明形式为: template(参数表) {     函数体 } 其中,temp

zzzmmmkkk的专栏 6539

Carsim2019与Simulink (Matlab2018b)联合仿真成功(超详细)

Carsim与Simulink联合仿真成功

强强的博客 3万+

C++函数模板案例——数组排序

案例描述: 利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序 排序规则从大到小,排序算法为选择排序 分别利用char数组和int数组进行测试 //交换的函数模板 template<typename T> void mySwap(T &a, T&b) { T temp = a; a = b; b = temp; } template<cl...

weixin_43867777的博客 3305

小程序HTTPS证书配置踩坑记:为什么Android访问失败而iOS正常?

本文深入剖析了小程序开发中常见的跨平台网络问题:Android访问HTTPS接口失败而iOS正常。核心原因在于服务器(如Nginx)HTTPS证书链配置不完整,Android系统对此校验严格,而iOS相对宽松。文章提供了从问题诊断、使用在线工具检测到修复Nginx证书链配置的完整解决方案,并总结了HTTPS部署的最佳实践,帮助开发者从根本上避免此类“玄学”故障。

weixin_29207149的博客 394

使用 Simulink + Simscape Electrical 实现一个变压器耦合式单相全波整流器的仿真模型

本文介绍了基于Simulink的变压器耦合式单相全波整流器建模与仿真方法。详细说明了从项目创建、模块添加、电路搭建到参数配置的完整建模过程,重点分析了整流器的效率与损耗特性,包括变压器损耗和二极管导通损耗。通过仿真展示了输入输出波形特征,并提出了选用高效元件、优化变压器设计等改进建议。该案例为电力电子系统建模提供了实用参考,有助于深入理解整流电路工作原理和性能优化方法。

amy_mhd的博客 186

【排序模板】

排序C/C++极简模板

博客网站地址: https://arsenova.xyz 我会将优快云上的博客重修一部分迁移到网站上。 文章会做同步更新,但我不会在这个糟糕的平台多待1秒。下面是我要说的话,save your time. keep going 1049

基于YOLO26深度学习框架的人脸识别门禁系统的算法研究实现方法

本文研究了基于YOLO26深度学习框架的人脸识别门禁系统实现方法。系统采用YOLO26目标检测算法,通过CSPDarknet53主干网络、特征金字塔结构和注意力机制实现高效人脸检测。研究内容包括数据预处理、模型训练优化和身份验证等关键技术,使用迁移学习策略和CIoU损失函数提升检测精度。该系统可应用于智能安防场景,具有实时性强、识别准确的特点,为门禁管理提供了智能化解决方案。

一键难忘的博客 766

【C++之函数模板】数据排序

题目要求: 对n个数据进行从小到大排序,数据类型可以是整型、单精度型、双精度型,用函数模板。 ——谭浩强的《C++面向对象程序设计》第1章习题第14小题

霍喜猫的博客 4963

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

C++回顾day03---<模板>

一:函数模板 建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表。这个通用函数就称为函数模板。凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只需要在模板中定义一次即可 (一)函数模板语法 template <类型形式参数表> 类型 函数名(形参参数表) { 执行语句; } 其中类型形式参数表形式为: t...

weixin_30587025的博客 118

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

快速排序模板

快速排序模板

weixin_44716083的博客 3899

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

akcms在模板文件中书写< php >,AKCMS模板函数标签的使用

在AKCMS的模板中可以编写标签调用网站内容,这些标签如下:getitems标签getitems函数是AKCMS中使用最广泛的函数,可以这么说,把这个函数弄明白了,就掌握了80%的AKCMS的使用。公用参数(get***系列函数都支持的参数)start:从第几篇文章开始,start="3"表示,抛弃符合条件的前2篇文章,从第3篇开始取,默认值为1num:取出的文章数,默认值是10colspan:子...

weixin_35897007的博客 336

C++ 冒泡排序,模板

模板是C++支持参数化多态的工具,是泛型编程的基础。模板可以实现类型参数化,即把类型定义为参数,真正实现了代码的可重用性,减少了编程及维护的工作量,并且降低了编程的难度。模板是类或函数在编译时定义所需处理和返回的数据类型。一个模板是类或函数的描述,及模板分为函数模板和类模板,本章将正对函数模板和类模板的相关知识进行讲解。

WdIg-2023的博客 967

Part2-->排序算法类模板

算法第四版第二章排序需要复用的代码的模板。 其中algs4 是算法这本书作者自己写的一个类库,包含了一些常用的简单的方法。 ps : less()比较大小的方法   exch()交换两个变量的值的方法   show()向控制台输出结果的方法   isSorted()测试数组元素是否有序的方法 1 import java.util.Scanner; 2 3 i...

175

归并排序及模板

文章目录归并排序理解归并排序模板 归并排序理解 归并排序的主要操作如下: (1)分解。把初始序列分成长度相同的左、右两个子序列,然后把每个子序列再分成更小的两个子序列,直到子序列只包含一个数。这个过程用递归实现。 (2)求解子问题,对子序列排序。最底层的子序列只包含一个数,其实不用排序。 (3)合并。归并两个有序的子序列,这是归并排序的主要操作。比如下面举例,把a[ ]分成两个子序列,比较后存进b...

ker的博客 2050

C++ 经典模板编程练习排序,又见排序!

总时间限制: 1000ms 内存限制: 65536kB // 在此处补充你的代码 描述 自己编写一个能对任何类型的数组进行排序的mysort函数模版。只能写一个mysort模板,不能写mysort函数! #include <iostream> using namespace std; bool Greater2(int n1,int n2) { ret...

wwxy1995的博客 1244
上一篇: 洛谷 1514 引水入城(记忆化搜索+DP)
下一篇: 洛谷 2661 信息传递(暴力、tarjan)
Loi_Mapleleaf
博客等级 码龄10年 17粉丝 72原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值