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

十大排序算法

项目地址: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.mfbz.cn/a/594851.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

linux(ubuntu18.04.2) Qt编译 MySQL(8.0以上版本)链接库 Qt版本 5.12.12及以上 包含Mysql动态库缺失问题

整理这篇文档的意义在于&#xff1a;自己走了很多弯路&#xff0c;淋过雨所以想为别人撑伞&#xff0c;也方便回顾&#xff0c;仅供参考 一、搭建开发环境&#xff1a; 虚拟机&#xff08;ubuntu-20.04.6-desktop-amd64&#xff09;&#xff1a;Mysql数据库 8.0.36Workbench …

QtWindows任务栏

目录 引言任务栏进度右键菜单缩略图工具栏完整代码 引言 针对Windows系统的任务栏&#xff0c;Qt基于系统的原生接口封装有一些非常见类&#xff0c;如QWinTaskbarButton、QWinTaskbarButton、QWinThumbnailToolBar等&#xff0c;用于利用工具栏提供更多的信息&#xff0c;诸如…

开源电子邮件营销平台 listmonk 使用教程

做产品肯定要做电子邮件营销&#xff0c;特别是面向海外的产品&#xff0c;电子邮件营销已成为企业与客户沟通、建立品牌忠诚度和推动销售的重要工具&#xff0c;可以直接接触到目标受众&#xff0c;提供个性化内容&#xff0c;并以相对较低的成本获得可观的投资回报。你看&…

用HAL库改写江科大的stm32入门例子_1、按键控制led灯

1 如下图设置PB11 管脚 2 设置PB11为下降沿中断&#xff1a; 3 PA1 设置为推挽输出 4、NVIC 开启中断使能&#xff1a; 5、写中断事件&#xff1a; 完整代码如下&#xff1a; void EXTI15_10_IRQHandler(void) {/* USER CODE BEGIN EXTI15_10_IRQn 0 *///torning on the led…

母婴店运用商城小程序店铺的效果是什么

母婴市场规模高&#xff0c;还可与不少行业无缝衔接&#xff0c;尤其是以90后、00后为主的年轻人&#xff0c;在备孕生育和婴儿护理前后等整体流程往往不惜重金且时间长&#xff0c;母婴用品无疑是必需品&#xff0c;商家需要多方面拓展全面的客户及打通场景随时消费路径。 运…

24.5.5(离散化+树状数组,线段树)

星期一&#xff1a; dp题单 背包 第四题 混可乐 cf传送门 思路&#xff1a;条件可演化为每种可乐值为 ai-n&#xff0c;选最少的可乐使总和为0&#xff08;具体可看官方题解 到这会发现背包并不适合了&#xff0c;其实这是道bfs伪装的背包…

【Linux网络】网络文件共享

目录 一、存储类型 二、FTP文件传输协议 2.1 FTP工作原理 2.2 FTP用户类型 2.3 FTP软件使用 2.3.1 服务端软件vsftpd 2.3.2 客户端软件ftp 2.4 FTP的应用 2.4.1 修改端口号 2.4.2 匿名用户的权限 2.4.3 传输速率 三、NFS 3.1 工作原理 3.2 NFS软件介绍 3.3 NFS配…

数据结构===二叉树

文章目录 概要二叉树的概念分类存储遍历前序中序后序 小结 概要 简单写下二叉树都有哪些内容&#xff0c;这篇文章要写什么 二叉树的概念分类&#xff0c;都有哪些二叉树遍历 对一个数据结构&#xff0c;最先入手的都是定义&#xff0c;然后才会有哪些分类&#xff0c;对二叉…

C语言 | Leetcode C语言题解之第70题爬楼梯

题目&#xff1a; 题解&#xff1a; int climbStairs(int n) {double sqrt5 sqrt(5);double fibn pow((1 sqrt5) / 2, n 1) - pow((1 - sqrt5) / 2, n 1);return (int) round(fibn / sqrt5); }

机器人系统ros2-开发实践05-将静态坐标系广播到 tf2(Python)-定义机器人底座与其传感器或非移动部件之间的关系

发布静态变换对于定义机器人底座与其传感器或非移动部件之间的关系非常有用。例如&#xff0c;最容易推断激光扫描仪中心框架中的激光扫描测量结果。 1. 创建包 首先&#xff0c;我们将创建一个用于本教程和后续教程的包。调用的包learning_tf2_py将依赖于geometry_msgs、pyth…

【负载均衡式在线OJ项目day1】项目结构

一.功能 查看题目列表&#xff0c;在线编程&#xff0c;判题功能&#xff0c;即leetcode的部分功能 二.宏观结构 整个项目是BS模式&#xff0c;客户端是浏览器&#xff0c;和用户交互并向服务器发起请求。 服务端从功能上来说分为两个模块&#xff0c;第一个是OJServer&…

FFmpeg———encode_video(学习)

目录 前言源码函数最终效果 前言 encode_video:实现了对图片使用指定编码进行编码&#xff0c;生成可播放的视频流&#xff0c;编译时出现了一些错误&#xff0c;做了一些调整。 基本流程&#xff1a; 1、获取指定的编码器 2、编码器内存申请 3、编码器上下文内容参数设置 4、…

平平科技工作室-Python-超级玛丽

一.准备图片 放在文件夹取名为images 二.准备一些音频和文字格式 放在文件夹media 三.编写代码 import sys, os sys.path.append(os.getcwd()) # coding:UTF-8 import pygame,sys import os from pygame.locals import* import time pygame.init() # 设置一个长为1250,宽为…

03.配置监控一台服务器主机

配置监控一台服务器主机 安装zabbix-agent rpm -ivh https://mirror.tuna.tsinghua.edu.cn/zabbix/zabbix/4.0/rhel/7/x86_64/zabbix-agent-4.0.11-1.el7.x86_64.rpm配置zabbix-agent,配置的IP地址是zabbix-server的地址&#xff0c;因为要监控这台主机 vim /etc/zabbix/zab…

淘宝线上扭蛋机小程序:推动扭蛋机销量

扭蛋机作为一个新兴的娱乐消费模式&#xff0c;能够带给消费者“盲盒式”的消费乐趣&#xff0c;正在快速发展中。消费者通过投币、扫码支付等&#xff0c;在机器上扭下按钮就可以随机获得一个扭蛋商品&#xff0c;这些商品也包括动漫衍生周边、IP主题商品等&#xff0c;种类多…

先电2.4的openstack搭建

先电2.4版本的openstack&#xff0c;前期虚拟机部署参考上一篇2.2版本&#xff0c;基本步骤是一样的&#xff0c;准备两个镜像文件CentOS-7.5-x86_64-DVD-1804.iso&#xff0c;XianDian-IaaS-V2.4.iso [rootcontroller ~]# cat /etc/sysconfig/network-scripts/ifcfg-eno16777…

新手开抖店多久可以出单?做好这两点!七天必出单!

哈喽~我是电商月月 很多新手开抖店长时间不出单&#xff0c;觉得不正常&#xff0c;害怕新手根本做不起来店&#xff0c;就会搜索&#xff1a;新手开抖店多久可以出单&#xff1f; 新手开店&#xff0c;合理运营的话&#xff0c;七天里肯定是能出几单的&#xff0c;但没做好的…

AI新突破:多标签预测技术助力语言模型提速3倍

DeepVisionary 每日深度学习前沿科技推送&顶会论文分享&#xff0c;与你一起了解前沿深度学习信息&#xff01; 引言&#xff1a;多标签预测的新视角 在人工智能领域&#xff0c;尤其是在自然语言处理&#xff08;NLP&#xff09;中&#xff0c;预测模型的训练方法一直在…

Android(一)

坏境 java版本 下载 Android Studio 和应用工具 - Android 开发者 | Android Developers 进入安卓官网下载 勾选协议 next 如果本地有设置文件&#xff0c;选择Config or installation folder 如果本地没有设置文件&#xff0c;选择Do not import settings 同意两个协议 耐…

Android 14 init进程解析

前言 当bootloader启动后&#xff0c;启动kernel&#xff0c;kernel启动完后&#xff0c;在用户空间启动init进程&#xff0c;再通过init进程&#xff0c;来读取init.rc中的相关配置&#xff0c;从而来启动其他相关进程以及其他操作。 init进程启动主要分为两个阶段&#xff1…
最新文章