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

【数据结构排序算法篇】----基数排序【实战演练】 今天我来继续聊聊数据结构排序算法----基数排序基数排序是一种非比较型整数排序算法,它的工作原理是按照数字的每一位来分配和收集元素。这种排序方式通常用于排序数字(尽管它也可以用于排序其他类型的数据,比如字符串),它可以处理从小到大的各个数字位,这被称作“最低位优先”(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    


 

 

 

 

深入解析ADC采样电容:从充电误差到LSB精度的关键设计 本文深入解析了ADC采样电容在模数转换中的核心作用,重点探讨了充电时间常数与采样误差的博弈关系。通过推导最小采样时间公式,揭示了精度、速度、源阻抗与内部电容之间的制约关系,并提供了从理论计算到外部驱动电路设计的实战指南,是确保ADC达到LSB精度的关键。 阅读详情

相关推荐

新装Win10/Win11后VMware虚拟机连不上网?手把手教你排查‘网络信息不可用’(从服务检查到网段配置)

本文详细介绍了在Windows 10/11系统上安装VMware Workstation后虚拟机无法联网的排查方法。从检查VMware NAT Service、DHCP Service等关键服务状态,到重置虚拟网络编辑器配置,再到内核设备驱动问题解决,手把手教你解决‘网络信息不可用’问题。特别针对VMCI驱动故障提供了实用解决方案,帮助用户快速恢复虚拟机网络连接。

weixin_28736335的博客 770

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

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

i289292951的博客 1851

超频玩家必看:TestMem5配置文件详解与内存稳定性测试实战(含黄金参数包)

本文详细解析了TestMem5(TM5)在内存超频稳定性测试中的核心价值与实战应用,特别针对DRAM颗粒特性提供黄金参数配置。通过anta777等专业配置的深度剖析,指导超频玩家精准定位内存故障,优化时序参数,实现性能与稳定性的完美平衡。涵盖从初级验证到极限压测的全流程方案,是硬件发烧友提升系统稳定性的必备指南。

weixin_29198045的博客 1812

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

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

weixin_45969711的博客 980

深入解析ROS 2 Control:从硬件抽象到实时控制的机器人框架实践

本文深入解析了ROS 2 Control机器人控制框架,阐述了其如何通过硬件抽象、控制器管理和实时性保障,解决机器人开发中硬件与软件紧耦合的痛点。文章详细剖析了其三层核心架构与数据流,并通过C++/Python代码示例演示了硬件接口的实现,最后提供了URDF配置、启动文件编写指南以及动态控制器管理、实时优化等高级应用与实战避坑技巧。

mqtt6iot的博客 620

避坑指南:英飞凌TC3XX的MCMCAN初始化常见错误及解决方法

本文针对英飞凌TC3XX系列MCU的MCMCAN模块初始化难题,深入剖析了寄存器配置时序、总线监控模式误用、中断映射错误及Message RAM地址冲突四大常见陷阱。通过实战代码示例和诊断流程,提供了清晰的避坑指南和解决方案,帮助嵌入式开发者高效解决CAN FD通信故障,确保汽车电子与工业控制项目的稳定运行。

weixin_29193259的博客 245

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

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

菜菜bu菜的博客 1063

S32K144 UDSdoCAN 升级刷写实现笔记

本篇旨在描述如何开发“车规级”的软件升级程序,通过在S32K144平台上实现基于UDSdoCAN的刷写升级功能,带你一步步建立安全升级的“工程思维”,在这里既能收获经验还能获得工程源码、测试脚本,助你起飞,避坑提速!

汽车电子软件领域知识分享 811

【算法系列】基数排序

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

斌斌(Java) 5171

如何在 R 中使用 Gamma 分布(附示例)

在统计学中,伽马分布通常用于模拟与等待时间相关的概率。我们可以使用以下函数来处理 R 中的 gamma 分布:dgamma(x, shape, rate) – 找到具有特定形状和速率参数的 gamma 分布的密度函数值。 pgamma(q, shape, rate) – 找到具有特定形状和速率参数的伽马分布的累积密度函数值。 qgamma(p, shape, rate) – 找到具有特定形状和速率参数的 gamma 分布的逆累积密度函数值。 rgamma(n, shape, rate) – 生成 n 个随机

Mrrunsen的博客 4415

YOLO创新点改进点的消融实验设计规范

YOLO改进的消融实验是一种重要的方法,用于评估和验证模型中不同组件的影响。在进行YOLO改进的消融实验时,我们可以选择一些可能的改进点,比如Backbone网络、Anchor框设计和损失函数设计,然后通过实验来分析它们对模型性能的影响。首先,我们需要确定实验设计。对于每个改进点,我们将设计多个实验组,并针对每个实验组训练模型并进行性能评估。这里以三个改进点为例进行说明:改进点1:Backbone网络 (改进点2:Anchor框设计 (改进点3:损失函数设计 (

crasher123的博客 2909

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

首先看看题目要求: 给定一个无序的整数数组,怎么找到第一个大于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

支付宝h5参数如何实现跳转?(包含相关Demo代码)

🏆本文收录于专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家!持续更新中,up!up!up!!

**My Coding Family** 3248

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

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

ffygvf的博客 127

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

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

首先看看题目要求: 给定一个无序的整数数组,怎么找到第一个大于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

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

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

首先看看题目要求: 给定一个无序的整数数组,怎么找到第一个大于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

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

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

原文地址: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、付费专栏及课程。

余额充值