【白话经典算法系列之十六】“基数排序”之数组中缺失的数字

【数据结构排序算法篇】----基数排序【实战演练】 今天我来继续聊聊数据结构排序算法----基数排序基数排序是一种非比较型整数排序算法,它的工作原理是按照数字的每一位来分配和收集元素。这种排序方式通常用于排序数字(尽管它也可以用于排序其他类型的数据,比如字符串),它可以处理从小到大的各个数字位,这被称作“最低位优先”(LSD)方法,或者从大到小的各个数字位,称为“最高位优先”(MSD)方法。基数排序的基本思想是将所有待比较的数字统一为相同的位数长度,位数较短的数字前面补零。然后,从最低位开始,依次进行一次分配和收集。 阅读详情

本文地址:http://blog.youkuaiyun.com/morewindows/article/details/12683723 转载请标明出处,谢谢。

欢迎关注微博:http://weibo.com/MoreWindows    

首先看看题目要求:

给定一个无序的整数数组,怎么找到第一个大于0,并且不在此数组的整数。比如[1,2,0]返回3,[3,4,-1,1]返回2,[1, 5, 3, 4, 2]返回6,[100, 3, 2, 1, 6,8, 5]返回4。要求使用O(1)空间和O(n)时间。

 

这道题目初看没有太好的思路,但是借鉴下《白话经典算法系列之十  一道有趣的GOOGLE面试题》这篇文章,我们不发现使用“基数排序”正好可以用来解决这道题目。

以{1, 3, 6, -100, 2}为例来简介这种解法:

从第一个数字开始,由于a[0]=1,所以不用处理了。

第二个数字为3,因此放到第3个位置(下标为2),交换a[1]和a[2],得到数组为{1, 6, 3, -100, 2}。由于6无法放入数组,所以直接跳过。

第三个数字是3,不用处理。

第四个数字是-100,也无法放入数组,直接跳过。

第五个数字是2,因此放到第2个位置(下标为1),交换a[4]和a[1],得到数组为{1, 2, 3, -100, 6},由于6无法放入数组,所以直接跳过。
此时“基数排序”就完成了,然后再从遍历数组,如果对于某个位置上没该数,就说明数组缺失了该数字。如{1, 2, 3, -100, 6}缺失的就为4。

这样,通过第i个位置上就放i的“基数排序”就顺利的搞定此题了。

 

代码也非常好写,不过在交换两数时要注意判断下两个数字是否相等,不然对于像{1, 1, 1}这样的数据会出现死循环。

完整的代码如下:

// 【白话经典算法系列之十六】“基数排序”之数组中缺失的数字
//  by MoreWindows( http://blog.youkuaiyun.com/MoreWindows ) 
//  欢迎关注http://weibo.com/morewindows
#include <stdio.h>
void Swap(int &a, int &b)
{
  int c = a;
  a = b;
  b = c;
}
int FindFirstNumberNotExistenceInArray(int a[], int n)
{
  int i;
  // 类似基数排序,当a[i]>0且a[i]<N时保证a[i] == i + 1
  for (i = 0; i < n; i++)
    while (a[i] > 0 && a[i] <= n && a[i] != i + 1 && a[i] != a[a[i] - 1])
        Swap(a[i], a[a[i] - 1]);
  // 查看缺少哪个数
  for (i = 0; i < n; i++)
    if (a[i] != i + 1)
      break;
  return i + 1;
}
void PrintfArray(int a[], int n)  
{  
  for (int i = 0; i < n; i++)  
    printf("%d ", a[i]);  
  putchar('\n');  
} 
int main()
{
  printf("    【白话经典算法系列之十六】“基数排序”之数组中缺失的数字\n");
  printf(" -- by MoreWindows( http://blog.youkuaiyun.com/MoreWindows ) --\n");
  printf(" -- http://blog.youkuaiyun.com/morewindows/article/details/12683723 -- \n\n");

  const int MAXN = 5;
  //int a[MAXN] = {1, 2, 3, 4, 7}; 
  //int a[MAXN] = {1, 3, 5, 4, 2};
  int a[MAXN] = {2, -100, 4, 1, 70};
  //int a[MAXN] = {2, 2, 2, 2, 1};
  PrintfArray(a, MAXN);
  printf("该数组缺失的数字为%d\n", FindFirstNumberNotExistenceInArray(a, MAXN));
  return 0;
}

运行结果如下图所示:

 

 

本文地址:http://blog.youkuaiyun.com/morewindows/article/details/12683723 转载请标明出处,谢谢。

欢迎关注微博:http://weibo.com/MoreWindows    


 

 

 

 

ESP8266红外控制美的空调:从协议解析到Home Assistant集成 红外遥控技术作为一种经典的非接触式控制方式,其原理是通过红外发光二极管发射经过特定频率调制的光信号来传递指令。在物联网和智能家居领域,利用微控制器如ESP8266模拟红外信号,成为将传统家电接入智能生态系统的关键技术。这项技术通过精准解析和生成符合设备厂商私有协议的红外编码,实现了对空调、电视等设备的远程与自动化控制,具有很高的实用价值。本文聚焦于美的空调的红外协议,深入探讨了其脉冲宽度调制(PWM)和全量式编码的特点,并提供了基于ESP8266的完整解决方案,包括硬件连接、库函数API详解以及如何将其无缝 阅读详情

相关推荐

从‘全步’到‘微步’:一张图看懂步进电机细分控制,选对模式让你的项目更丝滑

本文深入解析步进电机细分控制技术,从全步到微步的演进过程,帮助工程师根据项目需求选择最优控制模式。通过对比不同细分等级的性能特点和应用场景,提供3D打印、实验室自动化等领域的黄金配置方案,实现更精准、平稳的电机控制效果。

weixin_29290259的博客 471

深度解析基数排序:原理、实现与应用场景

总结来说,基数排序是一种利用元素位值进行排序的非比较型算法,其线性时间复杂度、稳定性以及对特定数据类型的高效处理能力,使其在特定场景下展现出显著优势。形象地说,基数排序就像是图书馆管理员按照图书编号的不同位数进行分类、排序的过程:先按编号的个位数分堆,再按十位数分堆,以此类推,最后将所有堆按照编号顺序合并,得到整齐排列的图书序列。对于处理大规模数据集,特别是内存受限但硬盘空间充足的环境,基数排序由于其线性时间复杂度和较低的空间复杂度,能够有效应对大数据排序需求。每趟排序后,待排序序列都会变得更有序。

i289292951的博客 1851

WebRTC TURN协议初识及turnserver实践

但是TURN协议对服务器有很高的依赖,服务器在带宽和集群上有很大的压力,所以TURN协议通常是当作ICE协议中的一部分来使用。ChannelData message不使用STUN头部,而使用一个4字节的头部,包含了一个称之为信道号的值(channel number),每一个使用中的信道号都与一个特定的peer绑定,即作为对等端地址的一个记号。该relay地址是个公网地址,可以看作是客户端A在公网上的一个代理,任何想要联系A的客户端,只要将数据发送到A的relay地址就可以了。

yinshipin007的博客 566

基数排序:原理、实现、优化与应用

在 Java 编程的算法体系里,排序算法是处理数据的关键工具。基数排序作为一种独特的排序算法,有着不同于其他排序算法的思路,在处理特定类型数据时表现出色。下面,我们就深入探讨 Java 中的基数排序。

weixin_45969711的博客 980

kettle从入门到精通 第九十二课 ETL之kettle 使用Kettle的Carte对外发布读写接口

场景:使用kettle实现将查询结果返回给客户端,也就是说kettle暴露查询接口供外围系统调用。前提必须是使用carte服务才可以提供接口供外部系统调用。具体实操方法如下:1、设计转换根据具体需求设计转换,主要用到的步骤有获取变量(从请求参数中获取变量)、json输入(解析入参),json 输出将结果转换为json格式输出到客户端。如下图所示:2、接收参数使用获取变量步骤来接收接口请求参数,变量通过${}方法进行获取,如下图${PARAM}则是获取PARAM参数,将参数赋值为req字段。

zhangjin1222的博客 954

Xftp卸载报错1628终极解决指南:深入解析InstallShield残留问题

本文深入解析了Xftp卸载时遇到的1628错误,其根源在于InstallShield安装引擎的残留问题。文章提供了从手动清理注册表项到彻底删除隐藏安装备份文件夹的完整解决方案,并给出了防患于未然的实用建议,帮助用户彻底解决这一经典安装报错。

weixin_29276847的博客 336

十大经典排序之:基数排序 |计数排序

十大经典排序之:归并排序 |桶排序基数排序基数排序原理算法实现例题计数排序计数排序原理算法实现例题

菜菜bu菜的博客 1063

MQTT与物联网平台(一):基础知识和设备接入物联网平台的实现(以华为云为例)

本文简单介绍了MQTT的基础知识和使用方法,以蓝牙WIFI双模芯片W801作为硬件设备,接入到华为云。

weixin_50622833的博客 1万+

【算法系列】基数排序

基数排序(Radix Sort)是一种非比较型整数排序算法,它通过逐位处理数字来实现排序。与快速排序、归并排序等基于比较的排序算法不同,基数排序利用了每个数字的位值进行排序,因此可以在O(n)的时间复杂度内完成排序任务。基数排序适用于对正整数、负整数以及固定长度的字符串进行排序。基数是指数字系统中的基本单位或基础值。它决定了一个数位上可能有多少种不同的符号或数值。例如,在十进制系统中,基数是10,因为每一位上有10种可能的符号(0到9)。

斌斌(Java) 5171

Labview项目01:标准可配置序列测试框架

摘要:本文介绍了一个基于LabVIEW2020开发的通用测试框架系统。该系统采用模块化设计,包含主界面、调试界面、设置界面和登录界面。主功能包括:1)可配置测试序列,支持延时、预定值输出、随机值输出等操作;2)单步测试功能自主添加;3)界面支持测试序列编辑和权限管理。系统采用队列机制处理事件和测试流程,通过CSV文件存储测试序列,支持参数化配置。用户可自定义测试VI(A_.vi和N_.vi格式),并通过调试界面验证测试序列。最终测试结果在主界面显示,提供整体判断功能。该系统既可作为学习参考,也可用于实际测试

weixin_38637405的博客 1552

PON架构(全光网络)

目前组网架构世界上有一种最快的速度又是光,以前传统以太网络规划满足不了现在的需求。有线网 无线网 全光网络方案场景 全光网络分类 以太全光网络 PON(Pas-sive-Optical Network 无源光网络) 再典型的中大型高校网络中 推荐万兆入室 千兆到桌面的带宽设计 一般三层 (终端-接入层-汇聚层-核心层-出口(安全设备)-互联网) 单校区核心设备 一般采用两台高性能的核心交换机 双机的方式采用的是 M-LAG 多校区之间核心交换机采用1

qq_56248592的博客 6269

白话经典算法系列之十六 “基数排序”之数组中缺失的数字

首先看看题目要求: 给定一个无序的整数数组,怎么找到第一个大于0,并且不在此数组的整数。比如[1,2,0]返回3,[3,4,-1,1]返回2,[1, 5, 3, 4, 2]返回6,[100, 3, 2, 1, 6,8, 5]返回4。要求使用O(1)空间和O(n)时间。 这道题目初看没有太好的思路,但是借鉴下《白话经典算法系列之十 一道有趣的GOOGLE面试题》这篇文章,我们不发现使用“基数排...

不二的博客 187

【银河麒麟桌面系统】自定义ISO镜像操作实践

本文详细介绍了麒麟操作系统Kylin-Desktop-V10-SP1的ISO镜像定制流程。通过挂载原始镜像、解压文件系统、进入chroot环境进行系统定制(包括文件替换和软件管理),最终重构squashfs并生成新ISO。关键步骤包括:挂载镜像到mnt目录、解压filesystem.squashfs、替换源配置文件、在chroot环境中清理系统、重新生成squashfs文件以及使用mkisofs命令创建新镜像。文章特别标注了x86和ARM架构的不同命令参数,并提供了安装测试验证方法。整个过程展示了从原始镜像

信创运维工程师 · 银河麒麟 & 容器实战 | 金融生产环境迁移·等保加固 | 142篇原创·17万+阅读 2342

【白话经典算法系列之十六】 基数排序 之数组中缺失的数字

【白话经典算法系列之十六】 基数排序 之数组中缺失的数字

ffygvf的博客 127

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

“基数排序”应用之数组中缺失的数字

首先看看题目要求: 给定一个无序的整数数组,怎么找到第一个大于0,并且不在此数组的整数。比如[1,2,0]返回3,[3,4,-1,1]返回2,[1, 5, 3, 4, 2]返回6,[100, 3, 2, 1, 6,8, 5]返回4。要求使用O(1)空间和O(n)时间。  我们不难发现使用“基数排序”正好可以用来解决这道题目。 以{1, 3, 6, -100, 2}为例来简介这种解法:

sum_rain的专栏 740

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

“基数排序”之数组中缺失的数字

首先看看题目要求: 给定一个无序的整数数组,怎么找到第一个大于0,并且不在此数组的整数。比如[1,2,0]返回3,[3,4,-1,1]返回2,[1, 5, 3, 4, 2]返回6,[100, 3, 2, 1, 6,8, 5]返回4。要求使用O(1)空间和O(n)时间。   这道题目初看没有太好的思路,但是借鉴下《白话经典算法系列之十  一道有趣的GOOGLE面试题》这篇文

395

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

基数排序之数组中缺失的数字

原文地址:http://blog.youkuaiyun.com/morewindows/article/details/12683723  首先看看题目要求: 给定一个无序的整数数组,怎么找到第一个大于0,并且不在此数组的整数。比如[1,2,0]返回3,[3,4,-1,1]返回2,[1, 5, 3, 4, 2]返回6,[100, 3, 2, 1, 6,8,

不净猫~的博客 441

MoreWindows 微软认证专家博客目录(白话算法,C++ STL,windows编程)

为了方便大家查找和学习,现将本人博客中所有博客文章列出目录。 (http://blog.youkuaiyun.com/morewindows) 一.      白话经典算法 目前有17篇,分为七大排序和经典面试题讲解两大类 1.      《白话经典算法系列之一 冒泡排序的三种实现》 2.      《白话经典算法系列之二 直接插入排序的三种实现》 3.      《白话经典算法系列之

在思索中前行! 1485

【排序算法】 白话经典排序算法

转载于:http://blog.youkuaiyun.com/morewindows/article/details/17488865 一.      白话经典算法 目前有17篇,分为七大排序和经典面试题讲解两大类 1.      《白话经典算法系列之一 冒泡排序的三种实现》 2.      《白话经典算法系列之二 直接插入排序的三种实现》 3.     

读书与思考的乐趣 534

秒杀多线程

便于学习,特把博主的文章转到此处。 转载请标明出处,原文地址:http://blog.youkuaiyun.com/morewindows/article/details/7392749 下面列出目录,方便大家查看。 1.《秒杀多线程第一篇 多线程笔试面试题汇总》 2.《秒杀多线程第二篇 多线程第一次亲密接触 CreateThread与_beginthreadex本质区别》 3.《秒杀多线程第三

@奮 鬥@的专栏 1064
上一篇: 【白话经典算法系列之十五】“一步千里”之数组找数
下一篇: Linux命令 crontab 定时任务
MoreWindows
MoreWindows 《白话经典算法》、《秒杀多线程》作者 《白话经典算法》、《秒杀多线程》作者 领域专家: 操作系统技术领域 领域专家: 操作系统技术领域
博客等级 码龄15年 2万+粉丝 157原创
评论 13
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值