归并排序和快速排序(C++)

news2024/11/25 0:46:42

归并排序是一种经典的排序算法,也被称为“归并算法”。它的基本思想是将待排序数组分成若干个子数组,每个子数组都是有序的,然后将这些子数组合并成一个大的有序数组。

具体实现过程如下:

  1. 将待排序数组不断划分为左右两个子数组,直到每个子数组只有一个元素为止。

  2. 对每个子数组进行排序,可以使用插入排序等算法。

  3. 将相邻的两个子数组合并为一个有序数组,直到整个数组排序完成。

归并排序的时间复杂度为O(nlogn),空间复杂度为O(n)。虽然它的常数因子较大,但它稳定性好、适用于大规模数据排序等优点使得它在实际应用中得到广泛使用。

#include<iostream>//归并排序
using namespace std;
int a[1000], n;
int b[1000];
void hebin(int l, int mid, int r)
{
	int p = l, q = mid + 1;
	for (int i = l; i <= r; i++)
	{
		if ((q > r) || (p <= mid && a[p] <= a[q]))
		{
			b[i] = a[p++];
		}
		else
		{
			b[i] = a[q++];
		}
	}
	for (int i = l; i <= r; i++)
		a[i] = b[i];
}
void merge_sort(int l,int r)
{
	if (l == r) return;
	int mid = (l + r) / 2;
	merge_sort(l, mid);    //对左边进行归并
	merge_sort(mid + 1, r);//对右边进行归并
	hebin(l, mid, r);     //合并
}
int main()
{
	int n;
	cin >> n;
	for (int i = 0; i < n; i++)
		cin >> a[i];
	merge_sort(0, n-1);
	for (int i = 0; i < n; i++)
		cout << a[i]<<" ";
}

快速排序是一种高效的排序算法,基本思想是通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,然后分别对这两部分记录继续进行排序,以达到整个序列有序的目的。

具体实现过程如下:

  1. 选择一个基准元素,通常选择第一个元素或者最后一个元素;
  2. 从序列的两端开始进行扫描,设立两个指示标志(low 和 high);
  3. 从后面开始扫描,如果发现有元素比基准元素小,则将其与基准元素交换;
  4. 从前面开始扫描,如果发现有元素比基准元素大,则将其与基准元素交换;
  5. 重复3和4步,直到 low 和 high 相遇;
  6. 将基准元素与 low 位置交换,这样就完成了一次排序;
  7. 递归地对基准元素左边的序列和右边的序列进行排序,直到整个序列有序为止。

快速排序的时间复杂度为 O(nlogn),是一种非常高效的排序算法。

#include<iostream>//快排
using namespace std;
int a[1000];
void quick_sort(int l, int r)
{
	int i = l, j = r;
	int mid = (l + r) / 2;
	int x = a[mid];
	while (i <= j)
	{
		while (a[i] < x) i++;
		while (a[j] > x) j--;
		if (i<=j)
		{
			swap(a[i], a[j]);
			i++, j--;
		}
	}
	if (l < j) quick_sort(l, j);//对左边
	if (i < r) quick_sort(i, r);//对右边
}
int main()
{
	int n;
	cin >> n;
	for (int i = 0; i < n; i++)
		cin >> a[i];
	quick_sort(0, n - 1);
	for (int i = 0; i < n; i++)
		cout << a[i]<<" ";
}

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

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

相关文章

IMX6ULL裸机篇之SPI实验-SPI主控代码实现

一. SPI 实验 SPI实验&#xff1a;学习如何使用 I.MX6U 的 SPI 接口来驱动 ICM-20608&#xff0c;读取 ICM-20608 的六轴数据。 本文学习 SPI主控芯片的代码编写。其中&#xff0c;包括SPI工作模式设置&#xff0c;主从模式设置&#xff0c;时钟配置等实现。 二. SPI 主控芯…

光学介质材料——光学膜

手机、平板、智能电视等设备之所以能够发光发亮离不开一个重要的组成材料——光学膜。那光学膜是什么回事呢&#xff1f; 光学膜是指在光学元件或独立基板上&#xff0c;制镀或涂布一层或多层介电质膜或金属膜或这两类膜的组合&#xff0c;以改变光波的传递特性&#xff0c;包…

MySQL索引:让你的数据库查询快到起飞!

&#x1f495;世界上最美好的东西之一&#xff0c;就是你每天都有机会开始全新的一天。&#x1f495; &#x1f43c;作者&#xff1a;不能再留遗憾了&#x1f43c; &#x1f386;专栏&#xff1a;MySQL学习&#x1f386; &#x1f697;本文章主要内容&#xff1a;详细介绍如何查…

SSD、内存和 L1 Cache 相比速度差多少倍

一道面试题&#xff1a;SSD、内存和 L1 Cache 相比速度差多少倍&#xff1f; 其实比起复杂的技术问题&#xff0c;我更喜欢在面试中提问这种像生活常识一样的简单问题。因为我觉得&#xff0c;复杂的问题是由简单的问题组成的&#xff0c;如果你把简单的问题学扎实了&#xff…

自动化运维工具—Ansible

一、Ansible概述 1.1 Ansible是什么 Ansible是一个基于Python开发的配置管理和应用部署工具&#xff0c;现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点&#xff0c;Pubbet和Saltstack能实现的功能&#xff0c;Ansible基本上都可以实现。 Ansible能批量配…

面试问题总结---嵌入式部分和项目部分

1、本栏用来记录社招找工作过程中的内容,包括基础知识学习以及面试问题的记录等,以便于后续个人回顾学习; 暂时只有2023年3月份,第一次社招找工作的过程; 2、个人经历: 研究生期间课题是SLAM在无人机上的应用,有接触SLAM、Linux、ROS、C/C++、DJI OSDK等; 3、参加工作后…

面试问题总结----ROS部分

1、本栏用来记录社招找工作过程中的内容,包括基础知识学习以及面试问题的记录等,以便于后续个人回顾学习; 暂时只有2023年3月份,第一次社招找工作的过程; 2、个人经历: 研究生期间课题是SLAM在无人机上的应用,有接触SLAM、Linux、ROS、C/C++、DJI OSDK等; 3、参加工作后…

Python3.9使用最新版pyinstaller将项目或程序打包成exe或者mac中的可执行文件

1、pyinstaller的说明&#xff1a; pyinstaller 能够在 Windows、Linux、Mac 等操作系统下将 Python 源文件打包&#xff0c;通过对源文件打包&#xff0c; Python 程序可以在没有安装 Python 的环境中运行&#xff0c;也可以作为一个独立文件方便传递和管理。 PyInstaller 支…

NLP-基于bertopic工具的新闻文本分析与挖掘

NLP-基于bertopic工具的新闻文本分析与挖掘 一&#xff0c;前言 最近简单接触了一些NLP的内容&#xff0c;练一下如何结合ChatGPT进行学习。 二&#xff0c;具体过程 &#xff08;1&#xff09;预处理文本&#xff0c;记录处理过程。 在使用Bertopic进行主题建模之前&…

【数据库一】MySQL数据库初体验

MySQL数据库初体验 1.数据库基本概念1.1 数据Data1.2 表1.3 数据库1.4 数据库管理系统1.5 数据库系统 2.数据库的发展3.主流的数据库介绍3.1 SQL Server&#xff08;微软公司产品&#xff09;3.2 Oracle &#xff08;甲骨文公司产品&#xff09;3.3 DB2&#xff08;IBM公司产品…

MySQL-索引详解(五)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xf…

【K8S系列】深入解析k8s网络之—网络故障

序言 你只管努力&#xff0c;其他交给时间&#xff0c;时间会证明一切。 文章标记颜色说明&#xff1a; 黄色&#xff1a;重要标题红色&#xff1a;用来标记结论绿色&#xff1a;用来标记一级论点蓝色&#xff1a;用来标记二级论点 Kubernetes (k8s) 是一个容器编排平台&#x…

FasterTransformer 005 初始化:如何将参数传给模型?

cpp的例子 device_malloc cpp没有用具体数值初始化 float *d_from_tensor NULL;device_malloc(&d_from_tensor, batch_size * seq_len * hidden_dim);https://github1s.com/NVIDIA/FasterTransformer/blob/v1.0/sample/cpp/transformer_fp32.cc#L35-L38 直接用的cudaMal…

【电子学会】2023年03月图形化四级 -- 绘制直尺

绘制直尺 编写一段程序&#xff0c;绘制一段7厘米的直尺。 1. 准备工作 &#xff08;1&#xff09;保留小猫角色&#xff0c;隐藏&#xff1b; &#xff08;2&#xff09;白色背景。 2. 功能实现 &#xff08;1&#xff09;点击绿旗&#xff0c;设置笔的颜色为红色&#…

事务和事务的隔离级别

一、事务 &#xff08;一&#xff09;为什么需要事务 事务是数据库管理系统&#xff08;DBMS&#xff09;执行过程中的一个逻辑单位&#xff08;不可再进行分割&#xff09;&#xff0c;由一个有限的数据库操作序列构成&#xff08;多个DML语句&#xff0c;select语句不包含事…

数字图像处理期末复习习题 SCUEC part1

1.在利用LoG算子做边缘检测的时候&#xff0c;作为一种经验法则&#xff0c;当滤波器空间参数为a7时&#xff0c;LoG滤波器空域模板大小应为 答&#xff1a;4343 理由是&#xff1a;n大于等于6a1 2.空间域方法主要分为灰度变换和空间滤波两类&#xff0c;灰度变换在图像的单…

【前端 - CSS】第 15 课 - 复合选择器

欢迎来到博主 Apeiron 的博客&#xff0c;祝您旅程愉快 &#xff01; 时止则止&#xff0c;时行则行。动静不失其时&#xff0c;其道光明。 目录 1、缘起 2、复合选择器 2.1、后代选择器 2.2、子代选择器 2.3、并集选择器 2.4、交集选择器&#xff08;了解&#xff09…

SpringBatch从入门到实战(三):父子Job和多步骤控制

一&#xff1a;Job嵌套 Job之前也可以嵌套&#xff0c;比如一个父Job封装多个已经存在的子Job。 Configuration public class ChildrenJobConfig {Autowiredprivate JobBuilderFactory jobBuilderFactory;Autowiredprivate StepBuilderFactory stepBuilderFactory;Beanpublic…

基础知识学习---牛客网C++面试宝典(八)操作系统--第三节

1、本栏用来记录社招找工作过程中的内容&#xff0c;包括基础知识学习以及面试问题的记录等&#xff0c;以便于后续个人回顾学习&#xff1b; 暂时只有2023年3月份&#xff0c;第一次社招找工作的过程&#xff1b; 2、个人经历&#xff1a; 研究生期间课题是SLAM在无人机上的应…

Golang每日一练(leetDay0096) 添加运算符、移动零

目录 282. 给表达式添加运算符 Expression Add Operators &#x1f31f;&#x1f31f;&#x1f31f; 283. 移动零 Move Zeroes &#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 …