计数排序(六)——计数排序及排序总结

news2024/11/18 1:21:37

fe594ea5bf754ddbb223a54d8fb1e7bc.gif

目录

一.前言

二.归并小补充

三.计数排序

操作步骤:

代码部分:

四.稳定性的概念:

五.排序大总结:

​六.结语


8fb442646f144d8daecdd2b61ec78ecd.png一.前言

我们已经进入排序的尾篇了,本篇主要讲述计数排序以及汇总各类排序的特点。码字不易,希望大家多多支持我呀!(三连+关注,你是我滴神!)

二.归并小补充

 归并排序即有外排序,也有内排序,这是它的弊端所在。

当数据太多的时候,就会把数据存在磁盘中。

假设我们有大约4G的数据那要选择什么排序好呢?

我们这里不能用希尔排序因为在磁盘中是不支持下标访问的。磁盘的特点是顺序写,顺序读。所以在这里只有归并排序在可以做到在磁盘中排序。

但别忘了我们还有1G的内存,我们把让小文件在里面进行排序再拿出来。这时候内存中的排序就可以用希尔排序了。

然后我们再通过合并两个有序序列的相关操作,用fscanf来读对比两个文件中谁小再fprintf写到大文件中去。

 以此类推

最后我们再对两个大文件进行对比,然后覆盖写入原文件中去。 

三.计数排序

思想:计数排序又称为鸽巢原理,是对哈希直接定址法的变形应用。

操作步骤:

  1. 统计相同元素出现次数
  2. 根据统计的结果将序列回收到原来的序列中

计数排序的特性总结:

计数排序在数据范围集中时,效率很高,但是适用范围及场景有限

时间复杂度:O(MAX(N,范围))

空间复杂度:O(范围)

稳定性:稳定 

接下来我们开始进行分析:

每个值对应一个位置,如5就对下标为5的地方++。

对所有值开始计数

当统计好出现的次数时,我们又应该如何排序呢?

在原数组中,0出现0次那我们就覆盖写0次,1出现3次,那我们就依次覆盖写3次.......

之所以会有排序的效果是因为我们count遍历的时候是从小到大去遍历的。

该排序也是有局限性的,在我们新的数据中最大数是199,那我们就得开200个空间去遍历它们,可是前面有100空间是浪费的,因为没有数出现在那。

这种方法本质是绝对映射,值为多少那么下标就为多少。

为了避免空间的浪费,我们采用的相对映射的方法,在投影下标时用该数减数据中的最小值就能得到相对位置,而在我们需要往回去覆盖时重新+最小值就可以回到原来的位置。这种适合范围相对集中的时候,如果出现绝对大的值那就不行了。

代码部分:

代码其实很好写,最关键的是要知道如何处理相对映射时的下标转换,以及返回覆盖时重新加上最小值。

void CountSort(int* a, int n)
{
	//找出最大与最小
	int max = a[0];
	int min = a[0];
	for (int i = 0; i < n; i++)
	{
		if (a[i] < min)
		{
			min = a[i];
		}
		if (a[i] > max)
		{
			max = a[i];
		}
	}
	//划定范围
	int range = max - min + 1;
	//创建count数组
	int* count = (int*)malloc(sizeof(int) * range);
	if (count == NULL)
	{
		perror("malloc faile");
		return;
	}

	//初始化数组
	memset(count, 0, sizeof(int) * range);

	//开始计数
	for (int i = 0; i < n; i++)
	{
		//记住要用到相对映射
		//往count数组里面计数
		count[a[i] - min]++;
	}
	//开始覆盖,最重要的一步
	int j = 0;
	for (int i = 0; i < range; i++)
	{
		while (count[i]--)
		{
			a[j] = i + min;
			j++;
		}
	}
}

时间复杂度:O(N+range)

因为我们不仅仅要遍历原数组a,还要遍历count数组。如果数据范围很大,那么range影响就大。

对于空间复杂度也是同理。

所以计数排序适用于数据范围集中的时候。

四.稳定性的概念:

如果排完序后能保证红5还在黑5的前面,那么这个排序就是稳定的。相同数据的顺序是否变化——相对顺序)

稳定性的意义:

假设我们比赛的时候有选手的分数是相同的,那我们就要看谁先提交,那谁就排前面。

五.排序大总结:

其中选择排序之所以不稳定是因为在确保1相对稳定时,我们无法保证3的相对稳定。

堆排序中因为堆顶的值要进行交换,所以也不能保证稳定性

快速排序也无法保证稳定性,当有3个5时,如果左边的5作key,那么它就会换到中间去,就破坏了相对顺序了。 

归并是可以做到稳定的,只要我们在取小插入的过程中把<改成<=就行了。 

4b12323f94834afd9ec146a3c10df229.jpeg六.结语

排序正式完结了,感谢大家对我的支持与陪伴,我会努力写出更通俗易懂的文章。最后感谢大家的观看,友友们能够学习到新的知识是额滴荣幸,期待我们下次相见~kk

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

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

相关文章

Nuget包缓存存放位置迁移

一、背景 默认情况下&#xff0c;NuGet会将项目中使用的包缓存到C盘&#xff0c;随着项目开发积累nuget包越来越多&#xff0c;这会逐渐挤占大量C盘空间&#xff0c;所以我们可以将nuget包缓存位置指定到其他盘中存放。 二、软件环境 win10、vs2022 三、查看当前缓存存放位…

realsence 455 查看左右摄像头

前言 我打算使用realsence的左右连个摄像头去自己标定配准、然后计算距离的&#xff0c;就需要找s、下载包。 没成想&#xff0c;这个455的左右摄像头是红外的 步骤 安装sdk&#xff1a; Intel RealSense SDK 2.0 – Intel RealSense Depth and Tracking cameras 尽量在w…

为什么要用云手机养tiktok账号

在拓展海外电商市场的过程中&#xff0c;许多用户选择采用tiktok短视频平台引流的策略&#xff0c;以提升在电商平台上的流量&#xff0c;吸引更多消费者。而要进行tiktok引流&#xff0c;养号是必不可少的一个环节。tiktok云手机成为实现国内跨境养号的一种有效方式&#xff0…

【新书推荐】3.2节 位运算之加减乘除

本节内容&#xff1a;二进制移位运算&#xff0c;以及逻辑运算与算术运算之间的转换。任何进制的位运算本质都是一样的。 ■二进制数移位运算&#xff1a;二进制数向左移位运算相当于做2的幂乘法运算&#xff0c;二进制数向右移位运算&#xff0c;相当于做2的幂除法运算。 ■十…

qt学习:Table widget控件

目录 头文件 实战 重新配置ui界面 添加头文件 在构造函数中添加初始化 显示方法 该实例是在sqlite项目上添加qt学习&#xff1a;QTSQL连接sqlite数据库增删改查-CSDN博客 头文件 #include <QTableWidgetItem> 实战 重新配置ui界面 用法介绍&#xff0c;可以双击…

大数据StarRocks(八):资源隔离实战

前言 自 2.2 版本起&#xff0c;StarRocks 支持资源组管理&#xff0c;集群可以通过设置资源组&#xff08;Resource Group&#xff09;的方式限制查询对资源的消耗&#xff0c;实现多租户之间的资源隔离与合理利用。在 2.3 版本中&#xff0c;StarRocks 支持限制大查询&#…

RK3568 Android 13 系统裁剪

android 13 系统裁剪是个大工程&#xff0c;裁剪也是需要大量的测试&#xff0c;才能保证系统的稳定性&#xff0c;以下是RK官方给出的裁剪方案&#xff0c;有兴趣的可以去看一下&#xff0c;对裁剪不是要求过高的可以根据官方的建议&#xff0c;对系统进行裁剪: Rockchip And…

ssh 配置

ssh 配置 在管理Git项目上&#xff0c;很多时候都是直接使用 https url 克隆到本地&#xff0c;当然也有有些人使用 SSH url 克隆到本地。 这两种方式的主要区别在于&#xff1a;使用 https url 克隆对初学者来说会比较方便&#xff0c;复制 https url 然后到 git Bash 里面直…

纯html+js+css个人博客

首页 <!DOCTYPE HTML> <html> <head> <title>博客</title> <meta http-equiv"Content-Type" content"text/html; charsetutf-8" /> <meta name"viewport" content"widthdevice-width, initial-sca…

E. Vlad and a Pair of Numbers(位运算)

思路&#xff1a;如果x在这一位是1&#xff0c;说明a,b在这一位一个是1一个是0&#xff0c;我们默认a为1&#xff0c;b为0.. 对于n的一些位为0&#xff0c;那么a&#xff0c;b在这一位肯定相同。我们想&#xff0c;如果a和b的和右移一位与x相同&#xff0c;所以1的位置是相同的…

按照模板生成文件,Word 或者 Excel

需求流程&#xff1a; 模板部分如图&#xff1a; Web端技术选用Jfinal 功能实现&#xff1a; 下面代码是调用 --“外部接口”--传参&#xff0c;将前端选中的信息传给后端&#xff0c; 另外将后端返回的文件流下载成文件 package ibasic.web.com.controller;import java.io.Bu…

链表--114. 二叉树展开为链表/medium 理解度C

114. 二叉树展开为链表 1、题目2、题目分析3、复杂度最优解代码示例4、适用场景 1、题目 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而…

ChatGPT更新了Mention功能,集结若干GPTs作战,AI智能体的心智入口;向量数据库的挑战和未来

&#x1f989; AI新闻 &#x1f680; ChatGPT更新了Mention功能&#xff0c;集结若干GPTs作战&#xff0c;AI智能体的心智入口 摘要&#xff1a;OpenAI在ChatGPT中引入了一个新功能&#xff0c;允许用户在聊天时任意一个GPTs&#xff08;即ChatGPT最新推出的AI Agent 智能应用…

Java 对部分接口返回数据进行加密,或其他处理

业务场景&#xff1a;后端项目中分为PC端和移动端接口&#xff0c;移动端为例如 mobile 开头的URl&#xff0c;需求为调用移动端接口时&#xff0c;对返回数据进行加密&#xff0c;PC端不加密 import cn.hutool.core.date.DatePattern; import cn.hutool.json.JSONConfig; impo…

HiveSQL题——排序函数(row_number/rank/dense_rank)

一、窗口函数的知识点 1.1 窗户函数的定义 窗口函数可以拆分为【窗口函数】。窗口函数官网指路&#xff1a; LanguageManual WindowingAndAnalytics - Apache Hive - Apache Software Foundationhttps://cwiki.apache.org/confluence/display/Hive/LanguageManual%20Windowin…

力扣题集(第一弹)

一日练,一日功;一日不练十日空。 学编程离不开刷题&#xff0c;接下来让我们来看几个力扣上的题目。 1. 242. 有效的字母异位词 题目描述 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意&#xff1a;若 s 和 t 中每个字符出现的次数…

粒子群算法求解港口泊位调度问题(MATLAB代码)

粒子群算法&#xff08;Particle Swarm Optimization&#xff0c;PSO&#xff09;是一种基于群体智能的优化算法&#xff0c;它通过模拟鸟群或鱼群的行为来寻找最优解。在泊位调度问题中&#xff0c;目标是最小化所有船只在港时间的总和&#xff0c;而PSO算法可以帮助我们找到一…

07. STP的基本配置

文章目录 一. 初识STP1.1. STP概述1.2. STP的出现1.3. STP的作用1.4. STP的专业术语1.5. BPDU的报文格式1.6. STP的选择原则&#xff08;1&#xff09;选择根桥网桥原则&#xff08;2&#xff09;选择根端口原则 1.7. 端口状态1.8. STP报文类型1.9. STP的收敛时间 二. 实验专题…

如何获得《幻兽帕鲁》隐藏帕鲁唤夜兽?13000个配种配方查询 幻兽帕鲁Steam好评率还在涨 Mac苹果电脑玩幻兽帕鲁 Crossover玩Windows游戏

《幻兽帕鲁》是一款Steam平台热门游戏&#xff0c;开放式大陆和养成式冒险结合&#xff0c;成为2024首款热门游戏&#xff0c;不过由于官方仅发布了Windows版的游戏客户端&#xff0c;Mac用户无法直接玩&#xff0c;好在有Crossover这样的神器&#xff0c;让苹果电脑也能玩上《…

U-Boot学习(6):初始化之_main函数源码分析

在上一节系统初始化之start.S源码分析详解中&#xff0c;我们分析了上电后的代码执行流程&#xff0c;实际上就是对系统特权模式、CP15、向量表等进行配置。最后一步就是进入_main函数了&#xff0c;这个就是U-Boot的主程序了&#xff0c;它完成了对系统内存、堆栈、全局结构体…