十大排序算法的介绍及常用六大算法的模板实现

十大排序算法

项目地址:
https://gitee.com/zhang---xuan/top-ten-sorting-algorithm

1.冒泡排序(Bubble Sort)

比较相邻元素,将较大的元素往后移动,每次遍历将最大的元素移到末尾。时间复杂度为O(n^2)。

template<class _TY>
void Bubble_Sort(_TY* A, int left, int right) {//冒泡排序for (int i = left; i <= right; i++) {for (int j = left; j < right; j++) {if (A[j] > A[j + 1]) {std::swap(A[j], A[j + 1]);}}}
}
2.选择排序(Selection Sort)

每次从未排序的部分选择最小(或最大)的元素放到已排序部分的末尾。时间复杂度为O(n^2)。

template<class _TY>
Selection_Sort(_TY*A,int left,int right){for(int i=left;i<right;i++){for(int j=i+1;j<=right;j++){if(A[j]<A[i])swap(A[i],A[j]);}}
}
3.插入排序(Insertion Sort)

将未排序的元素逐个插入已排序部分的合适位置。时间复杂度为O(n^2),在有序序列中表现良好。

template<class _TY>
Insert_Sort(_TY*A,int left,int right){for(int i=left+1;i<=right;i++){int k=i;while(A[k]<A[k-1]){swap(A[k],A[k-1]);k--;if(k==left)break;}}
}
4. 希尔排序(Shell Sort)

插入排序的改进版,通过将数组分成多个子序列进行排序,逐渐缩小子序列的长度,最终实现整体有序。时间复杂度为O(n log n)。

5. 归并排序(Merge Sort)

采用分治法的思想,将数组分成两个子数组,分别进行排序,然后合并两个有序子数组。时间复杂度为O(n log n)。

template<class _TY>
void Merge(_TY* A, int left, int right) {//合并int middle = (left + right) / 2;int L_Size = middle - left + 1;int R_Size = right - middle;_TY* L = new _TY[L_Size];_TY* R = new _TY[R_Size];for (int k = 0; k < L_Size; k++) {L[k] = A[left + k];}for (int k = 0; k < R_Size; k++) {R[k] = A[middle + k + 1];}int i = 0;int j = 0;for (int k = 0; k < right - left + 1; k++) {A[left + k] = [&]()->_TY {if (i >= L_Size)return R[j++];if (j >= R_Size)return L[i++];if (L[i] <= R[j])return L[i++];if (L[i] > R[j])return R[j++];return _TY{};}();}
}
template <class _TY>
void Merge_Sort(_TY* A, int left, int right) {//归并排序if (left >= right)return;Merge_Sort(A, left, (left + right) / 2);Merge_Sort(A, (left + right) / 2 + 1, right);Merge(A, left, right);
}
6. 快速排序(Quick Sort):

选择一个基准元素,将比它小的元素放在左边,比它大的元素放在右边,然后对左右两边分别递归地进行快速排序。时间复杂度为O(n log n),在大多数情况下表现良好。

template<class _TY>
int partition(_TY* A, int left, int right) {//数组划分srand(time(NULL));int n = rand() % (right - left+1) + left;swap(A[n], A[right]);int i = left - 1;for (int j = left; j < right; j++) {if (A[j] < A[right]) {swap(A[++i], A[j]);}}swap(A[++i], A[right]);return i;
}
template<class _TY>
void Quity_Sort(_TY* A, int left, int right) {//快速排序if (left >= right)return;int h = partition(A, left, right);Quity_Sort(A, left, h - 1);Quity_Sort(A, h + 1, right);
}
7. 堆排序(Heap Sort)

将数组构建成一个最大(或最小)堆,然后依次取出堆顶元素并调整堆的结构。时间复杂度为O(n log n)。

template <class_TY>
Heap_Maintenance(_TY*A,int i,int right){_TY X(A[i]);if(2*i<=right && A[2*i]>X)X=A[2*i];if(2*i+1<=right&&A[2*i+1]>X)X=A[2*i+1];if(X!=A[i]){if(X==A[2*i])swap(A[i],A[2*i]);else swap(A[i],A[2*i]);Heap_Maintenance(A,i,right);}
}
template <class _TY>
Heap_Create(_TY*A,int left,int right){int mid=(right+left)/2;for(int i=mid;i>=left;i--){Heap_Maintenance(A,i,left,right);}
}
template<class _TY>
Heap_Sort(_TY*A,int left,int right){Heap_Create(A,left,right);for(int i=right;i>=left;i--){swap(A[right],A[left]);right--;Heap_Maintenance(A,left,right);}
}
8. 计数排序(Counting Sort)

统计小于每个元素的个数,然后根据统计结果进行排序。时间复杂度为O(n+k),其中k是数据范围。

9. 桶排序(Bucket Sort)

将元素根据大小分配到不同的桶中,再对每个桶进行排序,最后合并所有桶的结果。时间复杂度取决于桶的数量和桶内排序的算法。

10. 基数排序(Radix Sort)

按照元素的位数进行排序,先按个位排序,再按十位排序,以此类推。时间复杂度为O(d*(n+k)),其中d是最大元素的位数,k是基数。

附录:测试用Int类型

class Int {
private:int val;
public:Int(int x=0) :val(x) {}~Int() {}Int(Int& p):val(p.val) {}Int(Int&&p):val(p.val){}Int operator+(Int &p)const {return Int(val + p.val);}Int operator-(Int& p) const{return Int(val - p.val);}Int& operator=(const Int& p){if (this != &p) {val = p.val;}return *this;}Int& operator=(int x) {val = x;return *this;}Int& operator+=(const Int& p) {val += p.val;return *this;}Int& operator-=(const Int& p) {val -= p.val;return *this;}bool operator>(const Int&p)const{return val > p.val;}bool operator<(const Int& p)const {return val < p.val;}bool operator<=(const Int& p)const {return !(val > p.val);}bool operator>=(const Int& p)const {return !(val < p.val);}Int operator*(const Int& p) const{return Int(val * p.val);}Int operator/(const Int& p) const{return Int(val / p.val);}Int& operator++() {++val;return *this;}Int operator++(int i) {Int S(val);val++;return S;}friend ostream& operator<<(ostream& out, const Int& p);friend istream& operator>>(istream& in, Int& p);
};
ostream& operator<<(ostream& out, const Int& p) {out << p.val;return out;
}
istream& operator>>(istream& in, Int& p) {in >> p.val;return in;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/9137.shtml

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

相关文章

buuctf-misc题目练习二

ningen 打开题目后是一张图片&#xff0c;放进winhex里面 发现PK&#xff0c;PK是压缩包ZIP 文件的文件头&#xff0c;下一步是想办法进行分离 Foremost可以依据文件内的文件头和文件尾对一个文件进行分离&#xff0c;或者识别当前的文件是什么文件。比如拓展名被删除、被附加…

元素设置 flex:1,但是会被内部长单词宽度超出拉伸

初始布局如上图&#xff0c;left中是代码编辑器&#xff0c;实际上是个文本域&#xff0c;当输入长文本过长时&#xff0c;left宽度会被拉伸。 右侧容器被挤压。 解决方案&#xff1a;width&#xff1a;0&#xff1b; .left{flex:1; width:0} 当输入长文本过长时&#xff0c…

保姆级零基础微调大模型(LLaMa-Factory,多卡版)

此处非常感谢https://github.com/hiyouga/LLaMA-Factory这个项目。 看到网上的教程很多都是教如何用webui来微调的,这里出一期命令行多卡微调教程~ 1. 模型准备 模型下载比较方便的方法: 1. modelscope社区(首选,速度很高,并且很多需要申请的模型都有)注意要选择代码…

信息系统架构_2.信息系统架构分类

信息系统架构可分为物理结构与逻辑结构两种&#xff0c;物理结构是指不考虑系统各部分的实际工作与功能结构&#xff0c;只抽象地考察其硬件系统的空间分布情况。逻辑结构是指信息系统各种功能子系统的综合体。 1.信息系统的物理结构 按照信息系统硬件在空间上的拓扑结构&…

HTML4(二)

文章目录 1 开发者文档2 基本标签2.1 排版标签2.2 语义化标签2.3 行内元素与块级元素2.4 文本标签2.5 常用标签补充 3 图片标签4 超链接标签4.1 跳转页面4.2 跳转文件4.3 跳转锚点4.4 唤起指定应用 5 列表5.1 有序列表5.2 无序列表5.3 自定义列表 6 表格6.1 基本结构6.2 表格标…

【Android】Kotlin学习之数据容器(数组创建)

kotlin数组 数组是一种初始化时指定容器大小, 不可以动态调整其大小的容器 数组创建

WPF之改变任务栏图标及预览

1&#xff0c;略缩图添加略缩按钮。 <Window.TaskbarItemInfo><TaskbarItemInfo x:Name"taskInfo" ProgressState"None" ProgressValue"0.6" ><TaskbarItemInfo.ThumbButtonInfos><ThumbButtonInfo x:Name"btiPlay&q…

深度解析Android 14新特性

Android 14新特性 前言行为变更所有应用核心功能用户体验无障碍功能安全性以 Android 14 或更高版本为目标平台的应用核心功能隐私权用户体验安全性非 SDK 限制新功能语法变化API语法性别的词形变化示例

雷伴品鉴【神农式】倪琴 倪诗韵古琴

雷伴品鉴【神农式】倪琴 倪诗韵古琴 此琴材质为老杉木音色细腻&#xff0c;下指按弹舒适&#xff0c;手感极好漆面精美&#xff0c;线条流畅。

AI编辑写作提示方法(二)

拼写和拼写错误 1.“您可以检查一下[文档/电子邮件/论文]是否有任何拼写错误和拼写错误&#xff1a;‘[内容]’&#xff1f;” 2.“请校对此[段落/句子]是否存在拼写错误&#xff1a;‘[文本]’” 3.“查看[博客文章/文章]并更正所有拼写错误&#xff1a;‘[链接]’” 4.“检查…

C数据结构:队列

简介 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出 FIFO(First In First Out) 的特点。 入队列&#xff1a;进行插入操作的一端称为队尾 。 出队列&#xff1a;进行删除操作的一端称为队头。…

OpenCV4.8 VS2019 MFC编程出现的诡异现象

OpenCV4.8及OpenCV4.4 VS2019MFC编程在调用imred&#xff08;&#xff09;函数时&#xff0c;debug X64试运行没问题。 release X64试运行时出现下面错误。 void CEasyPictureDlg::OnBnClickedOpen() {CFileDialog fdlg(TRUE, NULL, 0, OFN_HIDEREADONLY | OFN_OVERWRITEPROMP…

私人健身教练预约管理小程序开发源码现成案例(小程序+APP+H5 源码部署)

一、私人健身教练预约管理系统-环境介绍 1.1 私人健身教练预约管理系统-运行环境 开发语言&#xff1a;PHP 数据库&#xff1a;MySQL 系统架构&#xff1a;TP 后端&#xff1a;SpringBoot 前端&#xff1a;Vue 2. 私人健身教练预约管理系统-系统介绍。 2.1私人健身教练预约管…

EasyExcel导出带自定义下拉框数据的Excel模板

文章目录 前言&#x1f4dd;一、导入依赖二、创建导出工具1.创建模板实体类2.创建自定义注解3.添加动态选择接口4.EasyExcelUtil工具类 三、导出、导入Excel接口1.导出接口2.导入接口3.导出结果 总结 前言&#x1f4dd; 在项目中导入excel时需要通过下拉框选择值传入&#xff…

【websocket-客户端可视化工具】

postman 新版postman (版本v11以上) &#xff0c;除了http协议&#xff0c;还支持了Websocket&#xff0c;MQTT&#xff0c;gRPC等多种连接协议&#xff0c;可以作为多种协议的客户端&#xff0c;使用起来非常方便。 使用 服务端代码 这里以websocket协议举例&#xff0c;代…

基于51单片机的八路抢答器—加随机抽选功能

基于51单片机的八路抢答器 &#xff08;仿真&#xff0b;程序原理图&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1.主持人按键控制开始抢答&#xff1b; 2.开始抢答按下&#xff0c;数码管20秒倒计时&#xff1b; 3.8个按键代表八位选手&#xff0c;谁…

map容器

目录 map构造和赋值 map大小和交换 map插入和删除 map查找和统计 map排序 map构造和赋值 map中所有元素都是pair&#xff08;即一对&#xff09; pair中第一个元素为key&#xff08;键值&#xff09;&#xff0c;起到索引作用&#xff0c;第二个元素为value&#xff08;…

视频降噪算法 hqdn3d 原理分析

视频降噪 视频降噪是一种处理技术&#xff0c;旨在减少视频中的噪声&#xff0c;提高画面质量。噪声可能来自多种源头&#xff0c;包括摄像机的传感器、压缩算法、传输过程中的干扰等。降噪处理对于视频监控、视频会议、电影后期制作以及任何需要高画质输出的应用场景都非常重…

今天又发现一个有意思的问题:SQL Server安装过程中下载报错,证明GPT是可以解决问题的

我们在安装数据库的时候&#xff0c;都会有报错问题&#xff0c;无论是Oracle、SQL Server、还是MySQL&#xff0c;都会遇到各种各样的报错&#xff0c;这归根到底还是因为电脑环境的不同&#xff0c;和用户安装的时候&#xff0c;操作习惯的不一样导致的问题。今天的问题是&am…

Spring事务失效的场景

1. 事务方法执行期间出现了异常&#xff0c;但是并未指定rollbackFor: Spring默认只会在遇到error和RunTimeException时才会回滚。 public boolean rollbackon ( Throwable ex){return (ex instanceof RuntimeException || ex instanceof Error); } 2. 事务方法执行期间出现了…