数据结构——排序【下】

news2024/11/27 20:32:20

目录

一、计数排序

二、快速排序

三、归并排序

四、八大排序时间复杂度及其稳定性


一、计数排序

        计数排序是一个非基于比较的排序算法,元素从未排序状态变为已排序状态的过程,是由额外空间的辅助和元素本身的值决定的。该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法。是一种以空间换时间的行为。

        其是实现过程可用以下动图来展示: 

         

        实现思路:

        1.  该排序适用于该数组极值相差不大的情景,所以,我们可求得其范围进行创建数组辅助排序。

        2. 我们可求得该数组的最大和最小值,我们可采取映射思想,进行遍历明白各个数在新数组的相对位置。

        3. 将待排序集合每一个元素移动到计算得出的正确位置上。

        代码实现: 

void CountSort(int* a, int n)
{
	int max = a[0];
	int min = a[0];
	for (int i = 1; i < n; i++)
	{
		if (max < a[i])
		{
			max = a[i];
		}
		if (min > a[i])
		{
			min = a[i];
		}
	}
	//求范围
	int range = max - min + 1;
	int* tmp = (int*)calloc(range,sizeof(int));
	if (tmp == NULL)
	{
		perror("calloc fail");
		return;
	}
	//映射位置
	for (int i = 0; i < n; i++)
	{
		tmp[a[i] - min]++;
	}
	//进行排序
	int j = 0;
	for (int i = 0; i < range; i++)
	{
		while (tmp[i]--)
		{
			a[j++] = i + min;
		}
	}

	free(tmp);
	tmp = NULL;
}

        易错点:

        再最后排序时,一定要加的是 + min,如果加的为 tmp[i] 会导致出现问题,其原因为:tmp[i],在不断的变化,会导致排序出错。

        局限性: 

  •         该排序排序极值不能过大,否则会导致资源浪费。
  •         只能排整数。

二、快速排序

        快排的具体实现前文已经详细讲述,详情可见:深入理解并实现——快排【C语言版】-CSDN博客此处便不在赘述,以下为hoare版本实现:

int Hoare(int* a, int left,int right)
{
	int k = left;
	int begin = left;
	int end = right;
	while (begin < end)
	{
		while (begin < end && a[k] < a[end])		//这里等号可加可不加
		{
			end--;
		}
		while (begin < end && a[k] > a[begin])	
		{
			begin++;
		}
		swap(&a[begin], &a[end]);
	}
	swap(&a[begin], &a[k]);
	return begin;
}
 
void QuickSort(int* a, int left,int right)
{
	if (left >= right)		//递归结束条件判断
	{						//当左边与右边相等时,不用进行任何处理
		return;
	}
	int k = Hoare(a, left, right);
	QuickSort(a, left, k - 1);
	QuickSort(a, k + 1, right);	//区间为:左闭右开
}

三、归并排序

           归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。

        具体讲解可见:深入理解并实现——归并排序【C语言】-CSDN博客 

        以下为代码实现:

void _MergeSort(int* a, int* tmp, int left, int right)
{
	if (left >= right)
	{
		return;
	}
	int mid = (left + right) / 2;
	// 如果[begin, mid][mid+1, end]有序就可以进行归并了
	_MergeSort(a, tmp, left, mid);
	_MergeSort(a, tmp, mid + 1, right);
	//归并
	int begin1 = left, end1 = mid;
	int begin2 = mid + 1, end2 = right;
 
	int i = left;
	while (begin1 <= end1 && begin2 <= end2)
	{
		if (a[begin1] <= a[begin2])
		{
			tmp[i++] = a[begin1++];
		}
		else
		{
			tmp[i++] = a[begin2++];
		}
	}
 
	while (begin1 <= end1)
	{
		tmp[i++] = a[begin1++];
	}
 
	while (begin2 <= end2)
	{
		tmp[i++] = a[begin2++];
	}
 
	memcpy(a + left, tmp + left, sizeof(int) * (right - left + 1));
}
 
void MergeSort(int* a, int n)
{
	int* tmp = (int*)malloc(sizeof(int) * n);
	if (tmp == NULL)
	{
		perror("malloc fail");
		return;
	}
	_MergeSort(a, tmp, 0, n - 1);
 
	free(tmp);
	tmp = NULL;
}

四、八大排序时间复杂度及其稳定性

        一图以蔽之:

         排序稳定性:

        在排序算法中,如果有两个相等元素的顺序在排序之前是一样的,那么排序之后它们的顺序是否保持不变。一个稳定的排序算法会保持相等元素的相对顺序不变,而一个不稳定的排序算法则可能会改变相等元素的相对顺序。

        对于稳定性,大家可结合以下口诀进行记忆:

         考研很辛苦,心情不稳定。(快排)(希尔)(选择)一堆(堆排)朋友去干饭(干啥都行)。

        时间复杂度: 

        对于时间复杂度可结合一下口诀进行记忆:

         (希) 以(O(nlog2)) 队,最坏情况下 (希) 退化成O(n2)。

        排序上链接:数据结构——排序【上】-CSDN博客 

完!

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

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

相关文章

Github 2024-09-03 Python开源项目日报 Top10

根据Github Trendings的统计,今日(2024-09-03统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目10HCL项目1JavaScript项目1Payloads All The Things - 有用的Web应用程序安全负载和绕过列表 创建周期:2639 天开发语言:Python协议…

Go语言?IDEA能支持吗?增删查走起?

序&#xff1a; 最近突然身边突然开始冒出关于go语言的只言片语&#xff0c;很好奇这个go语言是怎么样的&#xff1f;这几天有空就会去网上浏览一遍各位大咖的简介。这边主要是已学习为目的&#xff0c;关键人家都说它好这边记录一下学习过程的进坑和爬坑过程供大家娱乐一下。…

echarts3D地图:旋转、添加纹理图片(vue3)

首先安装echarts和echarts-gl依赖&#xff0c;注意的是&#xff0c;echarts-gl版本需安装低版本&#xff0c;且与echarts5版本不兼容&#xff0c;需要单独安装4版本&#xff0c;这里我安装的4.2.1版本。 $ npm install echarts4npm:echarts4.2.1 echarts-gl1.1.0npm可以安装ec…

帧中继了解

定义 帧中继工作在OSI参考模型的数据链路层&#xff0c;是数据链路层使用简化的方法传送和交换数据单元的一种方式。 帧中继的重要特点之一是将X.25分组交换网中分组节点的差错控制、确认重传、流量控制、拥塞避免等处理过程进行简化&#xff0c;缩短了处理时间&#xff0c;这…

论文速读|通过人类远程操作的深度模仿学习框架:人型机器人的行走操纵技能

项目地址&#xff1a;Deep Imitation Learning for Humanoid Loco-manipulation through Human Teleoperation 本文详细介绍了 TRILL&#xff08;Teleoperation and Imitation Learning for Loco-manipulation&#xff09;框架&#xff0c;它是一个用于人型机器人行走操纵技能训…

华为OD机试真题 - 中文分词模拟器(Python/JS/C/C++ 2024 D卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

Spark-Yarn模式如何配置历史服务器

在Spark程序结束之后我们也想看到运行过程怎么办&#xff1f; Yarn模式下&#xff0c;通过以下步骤配置历史服务器即可: mv spark-defaults.conf.template spark-defaults.conf修改spark-default.conf 文件&#xff0c;配置日志存储路径 spark.eventLog.enabled true spark.…

pg小版本升级

文章目录 一、升级计划二、升级步骤1、安装目标版本数据库2、停止数据库实例3、备份数据目录4、调整环境变量&#xff0c;PGHOME/LD_LIRARAY_PATH5、使用新版本启动数据库 三、检查升级后的数据库 一、升级计划 pg14.0 -> pg14.9 查看当前版本信息&#xff1a; select ve…

24 - 第三方库的使用支持

---- 整理自狄泰软件唐佐林老师课程 文章目录 1. 第三方库的使用支持1.1 问题1.2 经验假设1.3 第三方库在项目中的位置 2. 第三方库的编译阶段支持3. 第三方库的链接阶段支持4. 实验 1. 第三方库的使用支持 1.1 问题 当需要使用第三方库文件时&#xff0c;编译环境中的 makef…

vue2中用到了 vuex 实现一个 留言板效果

一.效果图展示&#xff1a; 二.静态网页&#xff08;html&#xff09;代码 <template><div><h1>班级留言板</h1><ol><li v-for"(msg, index) in classmsgs" :key"index">{{ msg }} <a href"#" click.p…

折叠屏、曲面屏始终都是少数派,凭啥挑战iPhone16?

国内手机市场是一个很特别的市场&#xff0c;眼见着在处理器性能、拍照等方面都已无法再挑战苹果&#xff0c;国产手机这几年紧紧抓住折叠屏、曲面屏等差异化技术&#xff0c;试图与苹果掰手腕&#xff0c;然而从现实来看&#xff0c;这些技术其实都已失败了。 曲面屏基本可以说…

直接计算法计算CRC-32/MPEG-2

代码&#xff1a; #include<stdio.h>#define BUFFER_SIZE 114typedef unsigned int uint32_t; typedef unsigned char uint8_t;uint8_t output[BUFFER_SIZE*4]; static const uint32_t aDataBuffer[BUFFER_SIZE] {0x00001021, 0x20423063, 0x408450a5, 0x60c670e7, …

引领八亿人的“发现感”,深度旅游时代正式到来

原文链接&#xff1a;深度旅游新纪元已降临&#xff0c;我们正带领八亿旅行者开启探索之旅&#xff0c;发现世界的无限精彩 一些人在旅行时渴望探索全新的城市&#xff0c;体验那里独特的风情&#xff1b;而另一些人则被“必住榜”上的苏州平江华府酒店吸引&#xff0c;想要亲…

计算机毕业设计Spark+PyTorch股票推荐系统 股票预测系统 股票可视化 股票数据分析 量化交易系统 股票爬虫 股票K线图 大数据毕业设计 AI

《SparkPyTorch股票推荐与预测系统》开题报告 一、研究背景与意义 随着信息技术的飞速发展和全球金融市场的日益繁荣&#xff0c;股票投资已成为广大投资者的重要选择之一。然而&#xff0c;股票市场的复杂性和不确定性使得投资者在做出投资决策时面临巨大的挑战。传统的股票…

ceph中pg与pool关系

在Ceph中&#xff0c;PG&#xff08;Placement Group&#xff09;和Pool是非常重要的概念&#xff0c;它们在Ceph的存储架构中扮演着关键角色。理解这些概念有助于更好地管理和优化Ceph集群。下面详细介绍这两个概念及其相互关系。 Pool&#xff08;存储池&#xff09; 定义&am…

牧野机床采集数据

牧野于1958年研发出日本第一数控铣床,并于1966年研发成功日本第一台加工中心。我在市面上常见的到的加工中心P5、P6系统,其余的就是EDM数控系统。他们两个用的不是同一种系统,采集方式也有区别,大家要注意。 牧野机床(中国)有限公司,于2002年7月23日在江苏昆山成立,是一…

sqli-labs靶场通关攻略(六十一关到六十五关)

sqli-labs-master靶场第六十一关 步骤一&#xff0c;判断闭合方式 ?id1)) -- 步骤二&#xff0c;查看数据库 ?id1)) and updatexml(1,concat(1,(select database())),1) -- 步骤三&#xff0c;查看表名 ?id-1)) and updatexml(1,concat(1,(select group_concat(table_na…

【K8s】专题十三:Kubernetes 容器运行时之 Docker 与 Containerd 详解

本文内容均来自个人笔记并重新梳理&#xff0c;如有错误欢迎指正&#xff01; 如果对您有帮助&#xff0c;烦请点赞、关注、转发、订阅专栏&#xff01; 专栏订阅入口 Linux 专栏 | Docker 专栏 | Kubernetes 专栏 往期精彩文章 【Docker】&#xff08;全网首发&#xff09;Kyl…

记忆化搜索【上】

509. 斐波那契数 题目链接&#xff1a;斐波那契数 递归&#xff08;暴搜&#xff09; 斐波那契数列&#xff0c;最传统的解法&#xff0c;采用递归&#xff1a; class Solution { public:int fib(int n){return dfs(n);}int dfs(int n){if(n 0 || n 1)return n;return d…

搭建核心架构网络项目(局域网)

一个基础项目的搭建 一、项目简介 这个项目主要就是最基础的一个局域网&#xff0c;模拟现实企业的网络架构&#xff0c;确保网络的安全性&#xff0c;通过VLAN划分实现不同部门或用户组的隔离等。 下图是我们这次要搭建的局域网拓扑图。&#xff08;左边为财务部门&#xff0…