十大排序算法

news2025/1/11 2:37:18

十大排序算法的时间复杂度

1.冒泡排序

步骤:从头元素开始比较每一对相邻元素,如果第1个比第2个大,就交换它们的位置,执行完一轮,最末尾的那个元素就是最大的元素

1.1冒泡算法

void BubbleSort(int arr[], size_t length)
{
	for (int end = length-1; end > 0; --end)//
	{
		for (int begin = 0; begin < end; ++begin)
		{
			if (arr[begin] > arr[begin +1])
			{
				int tmp = arr[begin];
				arr[begin] = arr[begin + 1];
				arr[begin + 1] = tmp;
			}
		}
	}
}

1.2优化1:如果已经完全有序,可以提前结束比较

void BubbleSort(int arr[], size_t length)
{
	for (int end = length - 1; end > 0; --end)//
	{
		bool bSorted = true;
		for (int begin = 0; begin < end; ++begin)
		{
			if (arr[begin] > arr[begin + 1])
			{
				int tmp = arr[begin];
				arr[begin] = arr[begin + 1];
				arr[begin + 1] = tmp;
				bSorted = false;
			}	
		}
		if (bSorted == true) break;//已经完全有序
	}
}

1.3 优化2:如果序列尾部已经局部有序,可以记录最后一次交换的位置,减少比较次数

尾部提前有序的情况

//冒泡排序的优化  如果序列尾部已经局部有序,可以记录最后一次交换的位置,减少比较次数
void BubbleSort(int arr[], size_t length)
{
	for (int end = length - 1; end > 0; --end)//
	{
		//为数组完全有序做准备的,只进行一次外循环就退出
		int iLastSortIndex = 1;
		for (int begin = 0; begin < end; ++begin)
		{
			if (arr[begin] > arr[begin + 1])
			{
				int tmp = arr[begin];
				arr[begin] = arr[begin + 1];
				arr[begin + 1] = tmp;
				iLastSortIndex = begin;//记录一下最后一次比较的位置
			}
		}
		end = iLastSortIndex;
	}
}

最坏,平均时间复杂度:O(n^2)
最好时间复杂度:O(n)经过一轮循环,如果是完全有序,可以提前退出。

算法稳定性

如果两个相等的元素,在排序前后的相对位置保持不变,就是稳定。
冒牌算法是稳定的排序算法,注意不要将 > 写成 >=

2.选择排序

执行流程:. 从序列中找到最大的那个元素,然后与最末尾的元素交换位置,最末尾的元素就是最大的元素

void  selectSort(int arr[], size_t length)
{
	for (int end = length - 1; end > 0; --end)//
	{
		int maxIndex = 0;
		for (int begin = 0; begin < end; ++begin)
		{
			if (arr[maxIndex] < arr[begin])
				maxIndex = begin;
		}
		//跟结尾进行交换
		int temp = arr[maxIndex];
		arr[maxIndex] = arr[end];
		arr[end] = temp;
	}
}

最好,最坏,平均时间复杂度是O(n^2)

3.堆排序

对选择排序的一种优化
执行流程

  • 对序列进行原地建堆 O(n)
  • 重复执行以下操作,直到堆的元素数量为1 执行n-1
    1. 交换堆顶元素与尾元素
    2. 堆的元素数量减1
    3. 对0位置进行1次下滤操作 O(logn)
    堆排序的时间复杂度O(n(logn))

4.快速排序

执行流程:
1.从序列中选择一个轴点(pivot)元素
假设每次选择0位置的元素为轴点元素
2.利用pivot元素将序列分割成2个子序列

  • 将小于pivot的元素放在pivot前面
  • 将大于pivot的元素放在pivot后面
  • 等于pivot的元素放在哪边都可以
    3.对子序列进行1,2操作
    直到不能分割(子序列只剩下1个元素)

快速排序的本质:逐渐将每个元素都转换成轴点元素

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

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

相关文章

.netcore3.1+jenkins+Docker

一.git安装 1.下载 https://github.com/git/git/releases/tag/v2.40.1 2.将本地的安装包上传到 linux 服务器上&#xff0c;我这里放在 /opt/git/ 目录下 3.解压压缩包&#xff0c;得到目录 git-2.40.1&#xff0c;位置在 /opt/git/git-2.40.1 tar -zxvf git-2.40.1.tar.gz 4.…

AIGC产业研究报告2023——视频生成篇

易观&#xff1a;今年以来&#xff0c;随着人工智能技术不断实现突破迭代&#xff0c;生成式AI的话题多次成为热门&#xff0c;而人工智能内容生成&#xff08;AIGC&#xff09;的产业发展、市场反应与相应监管要求也受到了广泛关注。为了更好地探寻其在各行业落地应用的可行性…

【1++的C++初阶】之类与对象

&#x1f44d;作者主页&#xff1a;进击的1 &#x1f929; 专栏链接&#xff1a;【1的C初阶】 文章目录 一&#xff0c;面向对象与面向过程二&#xff0c;类2.1 类的定义2.2 类的访问限定符2.3 封装2.3.1 什么是封装2.3.2 封装的作用 2.4 类与对象 三&#xff0c;this指针3.1 什…

Docker 应用部署-MySQL

一、安装MySQL 1搜索mysql镜像 docker search mysql 2拉取mysql镜像 docker pull mysql:8.0.20 3创建容器 通过下面的命令&#xff0c;创建容器并设置端口映射、目录映射 #在用户名目录下创建mysql目录用于存储mysql数据信息 mkdir /home/mysql cd /home/mysql #创建docker容…

【数据结构】[LeetCode138. 复制带随机指针的链表]

一.问题描述 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中每个新节点的值都设为其对应的原节点的值…

5。STM32裸机开发(1)

嵌入式软件开发学习过程记录&#xff0c;本部分结合本人的学习经验撰写&#xff0c;系统描述各类基础例程的程序撰写逻辑。构建裸机开发的思维&#xff0c;为RTOS做铺垫&#xff08;本部分基于库函数版实现&#xff09;&#xff0c;如有不足之处&#xff0c;敬请批评指正。 &a…

ssm框架之SpringMVC:域共享数据

本篇主要聊的是在springmvc中的共享域传递数据的使用。如果对共享域可能不了解的话&#xff0c;可以看下前面聊servlet的时候&#xff0c;对共享域的详细描述&#xff0c;以及其作用和方法。传送阵 至于如何构建SpringMVC的环境&#xff0c;以及如何构建一个项目&#xff0c;可…

一款基于 Python+flask 的态势感知系统(附完整源码)

一、开发 一个基于linux的态势感知系统&#xff0c;基于python和flask框架开发&#xff0c;项目文件目录如下&#xff1a; admin -核心算法 charts -图表生成 model -类 app.py -主文件 config.py -配置文件 install.py -安装文件 项目文件在文章结尾处~ 二、安装 1、…

矩池云搭建DeepLabV3Plus网络,预测无人机遥感语义分割数据集

先上效果图&#xff0c;效果是真不错呀&#xff01; 带大家复现这个过程 一、下载源码 代码下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1MkW7DOgNHD5h5sfXQ6L1HA 提取码&#xff1a;ynev 权重下载地址&#xff1a; 链接&#xff1a;https://pan.bai…

Java - 欢迎使用spring中的Base64Utils!

&#x1f335;如果项目技术栈中包含spring&#xff0c;同时又有Base64编码的需求&#xff0c;那么Base64Utils工具类将会是你的最好选择&#xff01;⤵️ 什么是Base64编码&#xff1f;⤵️ 基本转换针对URL的转换 &#xff08;/替换为-_&#xff09; Base64Utils公开的AP…

工业软件上云:有“数据之根”方能向阳生长

有人说&#xff0c;数字化时代&#xff0c;所有的事情都值得用云的方式重新做一遍。 深以为然。作为拥有全球工业门类最为齐全的国家&#xff0c;中国近年来正在从制造大国向制造强国迈进。随着《中国制造2025》国家战略的稳步推进&#xff0c;制造业的数字化转型和智能化升级…

【倒计时2天】CCIG文档图像智能分析与处理论坛开启直播预约,共探智能文档处理前沿技术

文档是人们在日常生活、工作中产生的信息的重要载体&#xff0c;各领域从业者几乎每天都要与金融票据、商业规划、财务报表、会议记录、合同、简历、采购订单等文档“打交道”。让计算机具备阅读、理解和解释这些文档图像的能力&#xff0c;在智能金融、智能办公、电子商务等许…

9:00面试,9:03就出来了 ,问的实在是太变态了···

从外包出来&#xff0c;没想到竟然死在了另一家厂子 自从加入这家公司&#xff0c;每天都在加班&#xff0c;钱倒是给的不少&#xff0c;所以我也就忍了。没想到12月一纸通知&#xff0c;所有人都不许加班&#xff0c;薪资直降30%&#xff0c;顿时有吃不起饭的赶脚。 好在有个…

BRC20懂Web3?探寻宗教式社区建设- Yuga Labs「猿」宇宙案例解析

前言 早前&#xff0c;NFT 领域最强IP 缔造者Yuga Labs官宣&#xff1a;将基于Ordinal 协议在比特币区块链上推出NFT 系列「TwelveFold 」&#xff0c;为比特币NFT 生态添加了催化剂。所以以太坊失宠了吗&#xff1f;事实上&#xff0c;据欧科云链OKLink多链浏览器数据显示&am…

单精度浮点数与十进制数据相互转换

一、float基础&#xff1a; Float类型占4个字节,也就是32bit,其中最高位是符号位,2~9位是指数位,后边的23bit是数值位.如下所示 大部分数据的二进制形式都可以用科学计数法表示,即1.m*2^n这种形式,只要知道m和n,就能确定一个数值 二、小数位如何转变为二进制&#xff1a; 下面…

工业主板定制选型的要点都有哪些呢?

工业主板是工控机的核心部件。工控机通过工业主板将CPU等各种器件和外部设备有机地结合起来&#xff0c;形成一套完整的系统&#xff0c;因此工控机的整体运行速度和稳定性在相当程度上取决于工业主板的性能。工业主板应用范围广泛&#xff0c;使用环境复杂&#xff0c;因此用户…

键树_Trie树_介绍和C语言实现_20230511

键树_Trie树形式_树介绍及C语言实现 前言 上一篇提到键树有两种不同的表示方法&#xff0c;它们分别是双链树和Trie树&#xff0c;在上文中对双链树的数据结构以及在键树上的C语言实现做了详细的分析与讨论。如若键树中的结点的度较大&#xff0c;则采用Trie树结构较双链结构…

【软件工程】期末复习总结(通俗易懂,学不会来打我)

【软件工程】期末复习总结&#xff08;通俗易懂&#xff0c;学不会来打我&#xff09; 第一章 1.1 软件工程的发展历程 1.1.1 软件危机&#xff08;日子没法过了&#xff09; 软件危机&#xff08;Software Crisis&#xff09;是指在计算机软件开发、运行、维护和管理过程中…

126-Linux_git安装及使用

文章目录 一.git基本概念1.什么是git2.git的特点3.git工作流程4.文件的四种状态 二.git的安装1.在ubuntu上测试有没有安装2.使用命令 sudo apt install git 进行安装3.安装后查看版本,检查是否安装成功 三.git的使用1.git常用命令(1)创建一个目录(2)使用git init 命令将其变为一…

Netty编程入门超级详细,有这篇就足够了

目录 前言一、简介二、为什么使用Netty2.1 NIO的缺点2.2 Netty的优点 三、架构图四、永远的Hello Word4.1引入Maven依赖4.2 创建服务端启动类4.3 创建服务端处理器4.4 创建客户端启动类4.5 创建客户端处理器4.6 测试 五、Netty的特性与重要组件5.1 taskQueue任务队列5.2 schedu…