拜托,面试别再问我计数和桶排序了!!!

经典排序面试题 经典排序面试题 案例一 已知一个几乎有序的数组,几乎有序是指,如果把数组排好顺序的化,每个元素移动的距离不超过k,并且k相对于数组长度来说很小。请问选择什么方法对其排序比较好。 分析: 时间复杂度为O(N)的排序算法:计数排序、基数排序 不基于比较的排序算法的限制:不适用所有情况。 时间复杂读为O(N^2)的排序算法: 插入排序:插入排序的过程与原始顺序有关,每个元素移动距离不超过k。 对于本题来... 阅读详情

时间复杂度为O(n)的排序,除了基数排序(Radix Sort),还有计数排序(Counting Sort)。今天,1分钟,通过几幅图,争取让大家搞懂计数排序。

 

计数排序的适用范围?

待排序的元素在某一个范围[MIN, MAX]之间。

画外音:很多业务场景是符合这一场景,例如uint32的数字排序位于[0, 2^32]之间。

 

计数排序的空间复杂度?

计数排序需要一个辅助空间,空间大小为O(MAX-MIN),用来存储所有元素出现次数(“计数”)。

画外音:计数排序的核心是,空间换时间。

 

计数排序的关键步骤?

步骤一:扫描待排序数据arr[N],使用计数数组counting[MAX-MIN],对每一个arr[N]中出现的元素进行计数;

步骤二:扫描计数数组counting[],还原arr[N],排序结束;

 

举个栗子:

假设待排序的数组,

arr={5, 3, 7, 1, 8, 2, 9, 4, 7, 2, 6, 6, 2, 6, 6}

很容易发现,待排序的元素在[0, 10]之间,可以用counting[0,10]来存储计数。

 

第一步:统计计数

扫描未排序的数组arr[N],对每一个出现的元素进行计数。

 

扫描完毕后,计数数组counting[0, 10]会变成上图中的样子,如粉色示意,6这个元素在arr[N]中出现了4次,在counting[0, 10]中,下标为6的位置计数是4。

 

第二步:还原数组

扫描计数数组counting[0, 10],通过每个元素的计数,还原arr[N]。

 

如上图粉色示意,count[0, 10]下标为6的位置计数是4,排完序是4个连续的6。

从counting下标MIN到MAX,逐个还原,填满arr[N]时,排序结束。

 

神奇不神奇!!!

 

计数排序(Counting Sort),总结:

  • 计数排序,时间复杂度为O(n);

  • 当待排序元素个数很多,但值域范围很窄时,计数排序是很节省空间的

----------------------------------------------------------------------------------------------------------------------------------

排序,面试中考察基本功问的比较多的问题。

 

时间复杂度为O(n)的排序,常见的有三种:

  • 基数排序(Radix Sort)

  • 计数排序(Counting Sort)

  • 桶排序(Bucket Sort)

今天,1分钟,争取让大家搞懂桶排序。

画外音:百度“桶排序”,很多文章是错误的,本文内容与《算法导论》中的桶排序保持一致。

 

桶排序的适用范围是,待排序的元素能够均匀分布在某一个范围[MIN, MAX]之间。

画外音:很多业务场景是符合这一场景,待排序的元素在某一范围内,且是均匀分布的。

 

桶排序需要两个辅助空间:

  • 第一个辅助空间,是桶空间B

  • 第二个辅助空间,是桶内的元素链表空间

总的来说,空间复杂度是O(n)。

 

桶排序有两个关键步骤:

  • 扫描待排序数据A[N],对于元素A[i],放入对应的桶X

  • A[i]放入桶X,如果桶X已经有了若干元素,使用插入排序,将arr[i]放到桶内合适的位置

画外音:

(1)桶X内的所有元素,是一直有序的;

(2)插入排序是稳定的,因此桶内元素顺序也是稳定的;

 

当arr[N]中的所有元素,都按照上述步骤放入对应的桶后,就完成了全量的排序。

 

桶排序的伪代码是:

bucket_sort(A[N]){

     for i =1 to n{

           将A[i]放入对应的桶B[X];

           使用插入排序,将A[i]插入到B[X]中正确的位置;

     }

     将B[X]中的所有元素,按顺序合并,排序完毕;

}

 

举个栗子:

假设待排序的数组均匀分布在[0, 99]之间:

{5,18,27,33,42,66,90,8,81,47,13,67,9,36,62,22}

可以设定10个桶,申请额外的空间bucket[10]来作为辅助空间。其中,每个桶bucket[i]来存放[10*i, 10*i+9]的元素链表。

上图所示:

  • 待排序的数组为unsorted[16]

  • 桶空间是buket[10]

  • 扫描所有元素之后,元素被放到了自己对应的桶里

  • 每个桶内,使用插入排序,保证一直是有序的

 

例如,标红的元素66, 67, 62最终会在一个桶里,并且使用插入排序桶内保持有序。

 

最终,每个桶按照次序输出,排序完毕。

 

神奇不神奇!!!

 

桶排序(Bucket Sort),总结:

  • 桶排序,是一种复杂度为O(n)的排序

  • 桶排序,是一种稳定的排序

  • 桶排序,适用于数据均匀分布在一个区间内的场景

 

希望这一分钟,大家有收获。

 

计数排序与桶排序:非比较型排序算法的精妙之处 为什么它们能突破 ( O(n \log n) ) 的时间复杂度下限?它们的核心思想是什么?如何用生活中的例子理解?实际开发中如何选择和实现这两种算法?它们的适用场景和局限性是什么?本文将按照“概念引入→原理拆解→代码实战→场景分析”的逻辑展开,通过生活案例降低理解门槛,结合Python代码演示具体实现,最后总结两种算法的优缺点及使用建议。计数排序:通过统计每个值的出现次数,直接“数”出排序结果,时间复杂度 ( O(n + k) )(k是数据范围)。桶排序。 阅读详情

相关推荐

【数据结构排序算法篇】----桶排序【实战演练】

我们刚刚学完计数排序,今天我们再来讲讲桶排序,实际上桶排序就是计数排序的拓展版本,下面我们就来讲解一下桶排序。桶排序是一种分布式排序算法,它将元素分散到多个“桶”里进行排序。这里的“桶”可以理解为一系列的分类槽,每个槽会根据元素的一个特性来收集这些元素。通常,桶排序用于当输入数据均匀且独立分布在一个范围内时。初始化桶:创建一定数量的桶,这些桶可以是数组、链表或者其他集合。分配元素到桶中:遍历需要排序的元素,根据规则(如元素的大小或者其他属性)将它们放入对应的桶中。对每个桶内部排序。

m0_71685576的博客 1317

基于桶排序的高频面试题

给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度0(N) 且要求不能用非基于比较的排序 那么这道题就借用了桶排序的概念 #include <stdio.h> #include <stdbool.h> int compare_min(int ,int ); //找到最小值 int compare_max(int ,int ); //找到最大值 int ...

王高狮的博客 353

张正友标定法_单目-线激光三维扫描系统中光刀平面的标定

单目-线激光三维扫描系统中光刀平面的标定线结构光有结构简单、精度高、测速快等特点,被广泛应用于三维重建领域。线结构光三维扫描系统由一个相机和一个线结构光投射器构成,线结构光投射器将线结构光投射到被测物体表面,相机采集带有线激光的被测物体图像,根据相机和线激光投射器间的相对位置关系,使用激光三角法计算出激光线上的点在相机坐标系下的坐标。激光三角法原理如下图所示,线激光投射的扇形区域可以看作是一个平面...

weixin_39616379的博客 1074

拜托,面试别再问我桶排序了!!!

排序,面试中考察基本功问的比较多的问题。 时间复杂度为O(n)的排序,常见的有三种:基数排序(Radix Sort)计数排序(Counting Sort)桶排序(Buck...

架构师之路 3068

Kalibr 安装+制作采集的图片和IMU数据生成 .bag 文件 (坑最全,解决方法最简单,最详细哈哈)

方法一、Kalibr标定工具实现 开源代码连接:https://github.com/ethz-asl/kalibr 1.1 创建工作空间 ——下载程序——编译 mkdir -p ~/kalibr_workspace/src cd /kalibr_workspace/src git clone https://github.com/ethz-asl/Kalibr.git cd .. //返回上一级 catkin_make source devel/setup.bash ......

努力努力努力 6939

RK3588平台开发系列讲解(以太网篇)MDIO底层驱动

沉淀、分享、成长,让自己和他人都能有所收获!😄。

内核笔记 6882

排序算法总结及面试题

排序算法的总结及其相关面试题

void 1万+

高通SDX55平台:5G速率问题排查分析方法

和大家分享一下高通5G平台5G速率问题排查分析方法。

四儿家的小祖宗的博客 5217

某公司一道面试题:赛车名次, 桶排序

题目: Suppose you are a fan of auto-racing and want to figure out which drivers are likely to perform well in an upcoming race. Luckily you have access to a log of the times that each racer started an

2863

马达种类全解析:VCM、Stepper、Piezo 在手机相机中的驱动原理与工程差异

在现代手机影像系统中,马达承担着核心成像组件的动态调节任务,如自动对焦(AF)、光学防抖(OIS)以及变焦调节。目前主流采用三类驱动器件:VCM(Voice Coil Motor)、Stepper(步进马达)、Piezo(压电马达)。不同马达方案在结构复杂度、响应速度、功耗、驱动方式与模组厚度适配等方面差异显著,对成像系统的性能表现有直接影响。本文将结合最新旗舰设备的应用现状,系统剖析这三类驱动马达的工作原理、架构特点与工程应用经验,为工程实践中选型与调试提供参考。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 3772

荒岛逃生游戏

正负表示逃生方向(正表示向右逃生,负表示向左逃生),绝对值表示战斗力,越左边的数字表示里左边港口越近,逃生方向相同的人永远不会发生决斗。- 如果左逃生者的战斗力大于右逃生者,则左逃生者获胜,减少其战斗力,并将右逃生者出栈。- 处理完所有输入后,统计仍在右逃生者栈和左逃生者栈中的战斗力,即可得到成功逃生的人数。- 如果左逃生者的战斗力小于右逃生者,则右逃生者获胜,减少其战斗力,左逃生者出局。- 向左逃生:从右逃生者栈中取出元素,与当前逃生者进行决斗。- 继续进行决斗,直到没有右逃生者或左逃生者的战斗力用尽。

面试高手的博客 2101

数据结构与算法面试专题——桶排序

数据结构与算法面试专题——桶排序(排序总结)

从知识输入到知识输出 964

搭建一个简单的 Django + Vue 项目

在本文中,我将为您详细介绍如何搭建一个简单的 Django + Vue 项目。Django 是一个使用 Python 编写的高级 Web 框架,而 Vue 是一个流行的 JavaScript 框架,用于构建用户界面。通过结合 Django 和 Vue,我们可以创建强大的全栈 Web 应用程序。创建 Django 项目设置 Django 后端创建 Vue 前端连接 Django 和 Vue让我们开始吧!

JfpBlockchain的博客 350

今年java面试必问的这些技术面试是什么,创新,意外的惊喜

05 面试中的算法=========

2401_84023262的博客 560

大规模新闻聚合爬虫实战:Python爬取数百万新闻数据的完整指南

本文详细介绍了如何构建一个大规模新闻聚合爬虫,结合Python异步爬虫技术,实现高效、稳定的新闻数据采集。增加NLP模块对新闻内容做自动分类、情感分析。引入机器学习模型检测新闻真实性。使用分布式爬虫框架进一步提升规模。增加多媒体内容抓取与处理。

2201_76125261的博客 1553

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

桶排序、计数排序、基数排序

1、桶排序、计数排序、基数排序不是基于比较的排序,与被排序的样本的实际数据状况很有关系,所以实际中并不经常使用。 2、时间复杂度O(N),额外空间复杂度O(N) 3、稳定的排序 例子:给你一个数组,数组中的所有数的范围是0~60的,把这个数组排好序。 做法:生成一个长度为61的(词频)数组,初始化数组为{0,0,…,0}。然后遍历原数组,遇到一个数的时候,在该数对应词频数组下标的位置++,表示词频...

mabiao6822的博客 343

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

必学排序算法——桶排序

桶排序算法是必须掌握的一种基础算法,在一些比较出名的竞赛acm、蓝桥杯,并且在一些公司面试题中都可能会出现,而且作为简单题我们必须要拿下,所以我们要引起重视,下面让我们来深入了解桶算法。桶排序(Bucket Sort)是一种基于分配策略的排序算法,其工作原理是将数组分到有限数量的桶子里,然后对每个桶内的元素进行排序(可能再使用其他排序算法或是以递归方式继续使用桶排序),最后合并所有已排序的桶,从而完成整个数据集的排序。

ycs66的博客 9062

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【算法面试宝典】十大经典排序算法 - 桶排序

1 解题思路 桶排序是最简单的排序算法之一,桶排序和计数排序、基数排序有很多相似和渊源之处。桶排序重要的是它的思路,而不是具体的实现。不同待排序元素,桶排序的具体实现会有差异。 桶排序的工作原理是把待排序的元素放入对应的桶里。每个桶再进行单独的排序(可以是快速排序、可以是递归排序、也可以用递归的方式继续使用桶排序进行排序)。桶排序需要经过四步: 1)按照元素特性设计好桶; 2)把待排序元素放入对应的桶中; 3)对每个桶内的元素进行排序; 4)合并桶中的元素得到有序...

u010482601的专栏 4084

java面试堆排序_Java面试准备(7)排序——(堆排序、计数排序、桶排序)

欢迎点赞+评论+关注~~~~~~~1.堆排序1.1二叉堆概念以及原理二叉堆本质上是一种完全二叉树,它分为两个类型:大顶堆和小顶堆大顶堆(最大堆)最大堆的任何一个父节点的值,都大于或等于它左、右孩子节点的值。Java面试准备(7)排序——(堆排序、计数排序、桶排序)-1.jpg (11.84 KB, 下载次数: 0)2021-1-22 23:09 上传小顶堆(最小堆)最小堆的任何一个父节点的值,都小...

weixin_35133182的博客 213

LeetCode 347. 前K个高频元素 - 哈希计数、堆与桶排序详解

题目描述:给定一个整数数组 nums 和整数 k,请返回出现频率前 k 高的元素集合。若存在频率相同的元素,返回任意顺序均可。要求尽可能低的时间复杂度与合理的空间复杂度。原题链接:https://leetcode.cn/problems/top-k-frequent-elements/难度等级:Medium相关标签:数组、哈希表、堆(优先队列)、桶排序、排序| 解法 | 时间复杂度 | 空间复杂度 | 优点 | 缺点 | 适用场景 |

m0_52114506的博客 824

数据结构与算法笔记----基数排序和计数排序,桶排序

(1)计数排序算法思想 伪计数排序(被坑了,乍一看有点计数的思想,但是时间复杂度O(N^2),空间复杂度O(n),真的侮辱智商) 这是某博主的提供的思路 【 对每一个输人元素x,确定小于x 的元素个数。 利用这一信息,就 可以直接把x放到它在输出数组中的位置上了。 例如,如果有17个元素小于x,则x就应该在第18个输出位置上。 当有几个元素相同时,这一方案要略做修改。 因为不能把它们放在同一...

qq_41554337的博客 229

华山论剑之桶排序

华山论剑开始,报名名单为:郭靖,黄蓉,洪七公,欧阳锋,欧阳克,周伯通,瑛姑,黄药师,杨康,穆念慈,柯镇恶,尹志平。 要获取所有参赛者的最终排名,该如何设计算法呢? 如果用冒泡排序、选择排序、插入排序、希尔排序、堆排序、快速排序、归并排序,可能导致一些既浪费时间又浪费表情的比赛。 可以考虑把参赛人分为四个水平段位,然后,在相同的水平段位中分别比较,这就是所谓的桶排序。

认知 行动 坚持 2952

华山论剑的算法 引入桶排序

华山论剑的算法 华山论剑开始,报名名单为:郭靖,黄蓉,洪七公,欧阳锋,欧阳克,周伯通,瑛姑,黄药师,杨康,穆念慈,柯镇恶,尹志平。 要获取所有参赛者的最终排名,该如何设计算法呢? 如果用冒泡排序、选择排序、插入排序、希尔排序、堆排序、快速排序、归并排序,可能导致一些既浪费时间又浪费表情的比赛,比如: 洪七公VS 尹志平 欧阳锋 VS 欧阳克 黄药师 VS穆念慈 可以考虑把参赛人分为四个水平段位,然后,在相同的水平段位中分别比较,这就是所谓的桶...

jacklin_01的博客 217

计数排序、桶排序和基数排序

最近面试了一些人,发现大家都忽略了排序算法中的计数排序、桶排序和基数排序,segmentfault中都没有它们的标签就是一明证,呵呵! 计数排序 当输入的元素是 n 个 0 到 k 之间的整数时,它的运行时间是 Θ(n + k)。计数排序不是比较排序,排序的速度快于任何比较排序算法。 由于用来计数的数组C的长度取决于待排序数组中数据...

weixin_34221276的博客 153

10大排序算法之七:计数排序【稳定】,复杂度小,不常用计数排序,除非面试官特殊申明

1)除非面试官特殊申明,否则你不要用这种非比较的排序算法,要用基于比较的排序算法。 2)计数排序要求,arr中的元素范围不要太大,太大就没法统计了。

weixin_46838716的博客 1242
上一篇: 拜托,面试别再问我基数排序了!!!
下一篇: 谈谈CSMA/CD,TCP中的二进制指数退避算法
废言Pro
博客等级 码龄16年 1092粉丝 142原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值