模板----排序

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

(1)归并排序

时间复杂度O{nlogn),和快排一样。

归排是利用倍增(然而只是硬往倍增上靠)的思想,将分别有序的两个区间合并成一整个有序区间的算法,依据这两点可将所求区间不断二分,分别排序,再进行合并,从而达到整个区间排序的目的。因为每次直接处理的区间长度为2(当待处理区间仅有两个数时直接进行交换),所以排序过程总复杂度为logn,归并过程复杂度为n,每次排序后归并一次,于是得到总时间复杂度为nlogn。

*PS.c++中的stl库包含此函数,直接调用stable_sort(a,a+n)即可对数组a(0~n-1)进行稳定排序,内部实现应用就是归排,但有些题目是利用归排思想实现其他操作(例如下面会提到的求逆序对的个数),因此手打+改动也是有市场需求的。。。

手动归排代码实现:

int ans=0,a[50005],tmp[50005];

void merge(int l,int r,int mid)
{
	int pl=l,pr=mid+1,t=r-l+1;
	int i=1;
    while (i<=t&&pl<=mid&&pr<=r)
    {
    	if (a[pl]<=a[pr]) 
        {
        	tmp[i]=a[pl];
        	pl++;
        	i++;
        	continue;
		}
		else
		{
			tmp[i]=a[pr];
			pr++;
			i++;
		}
	}
	if (pl<=mid)
	for (int j=1;j<=mid-pl+1;j++) tmp[i+j-1]=a[pl+j-1];
	if (pr<=r)
	for (int j=1;j<=r-mid;j++) tmp[i+j-1]=a[pr+j-1];
	for (int i=l;i<=r;i++)
	a[i]=tmp[i-l+1];
}

void merge_sort(int l,int r)
{
	if (l==r-1||l==r) 
	{
		if (a[l]>a[r]) 
			swap(a[l],a[r]);
	}
	else
	{
		long long mid=(l+r)/2;
        merge_sort(l,mid);
    	merge_sort(mid+1,r);
    	merge(l,r,mid);
	}
}

int main()
{
	int n;
	scanf("%d",&n);
	for (int i=1;i<=n;i++)
	  scanf("%d",&a[i]);
	long long mid=(1+n)/2;
	merge_sort(1,mid);
	merge_sort(mid+1,n);
	merge(1,n,mid);
	for (int i=1;i<=n;i++)
	  printf("%d%c",a[i],' ');
	return 0;
}
*例题:给出n个无序数字,求这些数字中逆序对的总数(一个逆序对指一对数字a[i]和a[j],满足i<j&&a[i]>a[j]);

输入格式

第一行:一个整数n;

第二行:n个整数;

输出格式

一个整数,表示逆序对总数;

样例输入 

7

7 6 5 4 3 2 1

样例输出

21

思路:首先想到的是直接暴力枚举二重循环,n^2的时间复杂度,但当数据很大时会TLE;于是乎我们应当想出更优的方法,比如nlogn的归排,同时对逆序对进行判断累加。

代码实现:

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
using namespace std;
int ans=0,a[50005],tmp[50005];

void merge(int l,int r,int mid)
{
	int pl=l,pr=mid+1,t=r-l+1;
	int i=1;
    while (i<=t&&pl<=mid&&pr<=r) //当某一区间的数都处理完时退出;
    {
    	if (a[pl]<=a[pr]) 
        {
        	tmp[i]=a[pl];
        	pl++;
        	i++;
        	continue;
		}
		else
		{
			tmp[i]=a[pr];
			pr++;
			i++;
			ans+=mid-pl+1;  
                      //前后两个序列的数对换,因为两个序列分别有序,所以当后一序列有数a[j]比前一序列中的数a[i]小时,它一定也比前一序列中该数a[i]后面的数小,均构成逆序对;
		}
	}//哪个区间还有数就打包直接放到有序数组tmp中
	if (pl<=mid)
	for (int j=1;j<=mid-pl+1;j++) tmp[i+j-1]=a[pl+j-1];
	if (pr<=r)
	for (int j=1;j<=r-mid;j++) tmp[i+j-1]=a[pr+j-1];
	for (int i=l;i<=r;i++)
	a[i]=tmp[i-l+1];
}

void merge_sort(int l,int r)
{    
	if (l==r-1||l==r) 
	{
		if (a[l]>a[r]) 
		{
			swap(a[l],a[r]);
			ans++; //相邻两数交换,算作一个逆序对;
		}
	}
	else
	{
		long long mid=(l+r)/2;
                merge_sort(l,mid);
    	        merge_sort(mid+1,r);
    	        merge(l,r,mid);
	}
}

int main()
{
	int n;
	scanf("%d",&n);
	for (int i=1;i<=n;i++)
	  scanf("%d",&a[i]);
	long long mid=(1+n)/2;
	merge_sort(1,mid);  //左区间排序;
	merge_sort(mid+1,n);  //右区间排序;
	merge(1,n,mid);  //两区间归并;
	for (int i=1;i<=n;i++)
	  printf("%d%c",a[i],' ');
	return 0;
}


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

算法详解——链表的归并排序非递归解法

本文使用倍增法加上归并排序操作实现了对链表的快速排序,比起一般的递归式归并排序要节省空间并且实现要简单的多,比起一般的迭代式归并排序实现也要简单。

leedcanDD的博客 1481

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

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

971

历届试题 快速排序:

排序在各种场合经常被用到。快速排序是十分常用的高效率的算法。其思想是:先选一个“标尺”,用它把整个队列过一遍筛子,以保证:其左边的元素都不大于它,其右边的元素都不小于它。这样,排序问题就被分割为两个子区间。再分别对子区间排序就可以了。下面的代码是一种实现,请分析并填写划线部分缺少的代码。#include &lt;stdio.h&gt; void swap(int a[], int i, ...

sxy201658506207的博客 1496

c++模板实现快速排序

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

weixin_45369669的博客 918

DSPF28335:从零到一,实战GPIO与外部中断的嵌入式系统交互设计

本文以德州仪器DSPF28335芯片为例,详细讲解了嵌入式系统中GPIO与外部中断(EXTI)的实战配置方法。通过一个完整的按键控制LED并触发ADC采样的项目,深入剖析了GPIO寄存器配置、三级中断机制(外设-PIE-CPU)以及中断服务函数编写的核心要点,帮助开发者掌握嵌入式交互设计的基石,并提供了关键的避坑指南与调试清单。

weixin_29169899的博客 115

蓝桥杯-【快速排序】【2016年省赛B组题解】【C++】

2016年第七届蓝桥杯题目汇总 http://blog.youkuaiyun.com/qq_34202873/article/details/79646517 第四题 快速排序 排序在各种场合经常被用到。 快速排序是十分常用的高效率的算法。 其思想是:先选一个“标尺”, 用它把整个队列过一遍筛子, 以保证:其左边的元素都不...

老陈聊架构 3813

麒麟信安3.3-6C电网版虚拟机安装避坑指南:从ISO下载到SSH配置全流程

本文提供麒麟信安3.3-6C电网版虚拟机的详细安装与配置指南。针对电力行业仿真测试需求,重点解析从ISO镜像获取、虚拟机环境准备、安装过程中的三大“雷区”(如多管理员密码逻辑、分区方案、网络配置)到首次启动后的网络、SSH及root策略配置的全流程避坑要点,帮助技术人员高效、安全地完成部署。

rainy的博客 854

2016年蓝桥杯C语言大学A组题目4--快速排序

题目4.快速排序 排序在各种场合经常被用到。 快速排序是十分常用的高效率的算法。   其思想是:先选一个“标尺”, 用它把整个队列过一遍筛子, 以保证:其左边的元素都不大于它,其右边的元素都不小于它。   这样,排序问题就被分割为两个子区间。 再分别对子区间排序就可以了。   下面的代码是一种实现,请分析并填写划线部分缺少的代码。 #include voidswap(in

社畜のブログ 3497

[运动规划算法]基于飞行走廊的轨迹优化

文章目录简介一、介绍二、原理飞行走廊生成三、项目演示参考 简介 Btraj是一个在线的四旋翼无人机的运动规划框架,主要用于未知环境中的自主导航。基于机载状态估计和环境感知,采用基于快速行进(FM *)的路径搜索方法,从基于构建的欧氏距离场(ESDF)中寻找路径,以实现更好的时间分配。通过对环境进行膨胀生成四旋翼无人机的飞行飞行走廊。使用伯恩斯坦多项式将轨迹表示为分段Bezier曲线,并将整个轨迹生成问题转换成凸问题。通过使用Bezier曲线,可以确保轨迹的安全性和高阶动力学可行性,可以将轨迹完全限制在安全

xiewf的博客 8063

STM32异常与中断过程详解

1. 异常与中断概念引入 异常主要是指来自CPU内部的意外事件,比如执行了未定义指令、算术溢出、除零运算等发生在CPU内部的意外事件,这些异常的发生,会引起CPU运行相应的异常处理程序;中断一般来自硬件(如片上外设、外部I/O输入等)发生的事件,当这些硬件产生中断信号时,CPU会暂停当前运行的程序,转而去处理相关硬件的中断服务程序。但无论是异常还是中断,都会引起程序执行偏离正常的流程,转而去执行异常/中断的处理函数。 下面对异常和中断的介绍,如果中断信号的产生原因来自CPU内部,则称之为异常;如果中断信号来

luobeihai的博客 1万+

模板:排序(一)

在续讲故事之前,我们先来聊一聊勇者打工的经历。 * 停,在那之前还得科普一件事情。我们来讲一下什么是排序算法的稳定性。 这个大概是最玄学的东西了,引用百科的话: “假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不...

weixin_34290631的博客 276

win10 离线安装.Net Framework3.5

起因,安装软件比如3dmax2014等需要.Net Framework3.5支撑,那么需要安装低版本的.Net Framework3.5 闲话少说。 1.下载 NetFx3.cab 链接: https://pan.baidu.com/s/124to7F3BOy4yAlY61OjbDg 提取码: kixu 2.将NetFx3.cab 放入 系统盘的windows目录下(示例 C:\Wi...

m0_37615458的博客 7718

【排序模板】

排序C/C++极简模板

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

【知识点总结】电路原理 第一讲

大家好,从今天起,我将开始更新自上大学以来所学到的各种知识,之所以选择更新它们是因为最近我一直在收拾整理自己自上大学以来所收获到的各种知识,看着那厚厚一沓的书本心里不由得犯愁。如果我想找到特定的知识,那岂不是得翻到猴年马月。俗话说得好,下雨天打鞋子,闲着也是闲着,为此我设置一个专栏,将知识点一一分类总结,目的在于更好的整理所学的知识。本人学艺不精,有一些知识点地方可能存在瑕疵,希望各位大佬可以多多指教。以下是本篇文章正文内容虚断:一般通用性运算放大器的正反向输入端之间的电阻非常非常的大。

weixin_51130221的博客 4万+

YOLOv10改进,YOLOv10二次创新C2f结构采用WTConv卷积(感受野的小波卷积),ECCV 2024

WTConv 的核心思想是通过结合卷积神经网络(CNN)的强大特征提取能力与小波变换的多尺度特性,来实现大感受野的卷积操作,同时避免传统大卷积核带来的参数爆炸问题。传统的卷积操作通过滑动小窗口在图像上逐步执行局部特征提取,感受野的大小直接取决于卷积核的尺寸。随着卷积核的增大,参数量呈指数增长,导致网络训练效率降低、计算资源消耗增加。为解决这些问题,WTConv 提出了在小波域中执行卷积操作的策略。小波变换是一种常用于信号处理的技术,能够将信号分解为不同频率成分。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1022

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

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

weixin_43867777的博客 3305

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

[算法]冒泡排序模板

冒泡排序模板 #include <iostream> #include<cstdio> using namespace std; //bubbleSort void bubbleSort(int a[], int n){//这里int a[] 其实就是数组的首地址;n是数组中待排序元素的个数,不是下标 int tmp = 0; for(int i=0;i&...

LumenWang 531

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

C++ 冒泡排序,模板

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

WdIg-2023的博客 967

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

排序算法模板实现

常见的排序算法模板实现 学过的东西总是很容易忘记,最近用模板整理 了常见的排序算法。涉及模板的知识在这里我就不细细的介绍了。 #pragma once​#define NULL 0#define MARK -65535​​template<class T> //声明class CDaXiongTemplateSort{public: CDaXiongTe...

weixin_30412577的博客 188

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

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

霍喜猫的博客 4963

简单模板排序的实现(回顾排序)

复习几种排序算法,并且放到类里实现,可以直接用。 /* 用模板实现排序的类Sort 简单的把几个常用的排序方法加到Sort类里面 其中包含冒泡排序,选择排序,快速排序,归并排序 */ template class Sort{ public: // 冒泡排序 static void BubbleSort(T* array, int size); // 选择排序 static void

小番茄 863

c++排序模板

c++排序模板

ZYS_as_0111的博客 328

C++排序模板实现

昨天做了道题,突然懵逼,模板有点忘记了。复习一下子。 #include<iostream> using namespace std; template<class T> void swap(T *a,T *b) { T z; z = *a; *a = *b; *b = z; } template <class T> int complate(T a,T b) { return a>b?1:(a<b?-1:...

qq_32579021的博客 554

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

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

wwxy1995的博客 1244
上一篇: poj 1160 post office------DP
下一篇: noi 1805 碎纸机-----搜索
zero_from
博客等级 码龄10年 11粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值