《算法导论的Java实现》 9 线性时间排序

线性时间选择 5元组选中位数法 线性时间选择 5元组选中位数法,算法导论9.3节代码实现 阅读详情

9 线性时间排序

 

9.2 计数排序


伪代码:


 

 

Java代码:


 

 

输出:
0 0 2 2 3 3 3 5

 

code后感
不同于“比较排序”(插入排序,堆排序,快速排序,都是要“比较”数组的值的,所以都是“比较排序”),计数排序的速度非常快,而且是个“稳定排序”。
程序本身非常干净,一共只是4个循环。
最后一个循环稍微有一点点难解,Java程序的数组下标的起始值和伪代码里面的不太相同。
《算法导论》第一版和第二版在这段伪代码里面的数组下标的起始值本身就不同。幸亏代码本身不难,所以也不会有太大困扰。
建议单步跟踪着来运行Java代码,观察A,B,C数组的值的变化,可以看出A,B,C数组的值和《算法导论》里面的图示是一致的。这样可以更容易的去理解这个算法。

 

 

9.3 基数排序


伪代码:


 

 

Java代码:


 

 

输出:
3 12 13 20 25 30 32 43

 

code后感
伪代码很短,Java代码有点长。
因为第二行伪代码是说:以数组A的第i位为键,用一个稳定排序来排。
迄今为止,《算法导论》里介绍过的稳定排序,只有前一节的计数排序,而那一节的计数排序,显然不能直接用在这里。不得不把前一节的计数排序改写一下。
必须注意的是,这一节的计数排序public static int[] countingSort(int[] A, int d)和前一节的参数(int[] A, int d)虽然相同,但是意义完全不同。前一节的计数排序里,第二参数(int k),是表示数组A可能的值的个数。上一节里的例子,数组A在0到5之间,所以k为6。这一节,考虑排列的是10进制数,所以就在程序里定下为10,不由参数引入,而
(int d)是排序的键值所在的位数,测试程序里,d会做循环,从0到1为止。

 

 

9.4 桶排序


伪代码:


 

 

Java代码:


 

 

输出:
0.12 0.17 0.21 0.23 0.26 0.39 0.68 0.72 0.78 0.94

 

code后感
和上一节一样,伪代码短,Java代码很长。
原因在于,桶排序的第一步是将各个待排元素装到桶里,第二步就是对各个桶进行插入排序。
插入排序insertionSort,在1.1.1节我已经介绍过,在这里,把1.1.1的程序原封不动,copy过来使用。让忘记插入排序的人,再复习一下。

第9章《线性时间排序》就这么结束了,程序都比较简单,相比堆排序和快速排序,无论计数排序还是基数排序,亦或桶排序,理解伪代码并不困难。但是,都用到了前面的知识,所以温故而知新,复习一下前面的插入排序还是有必要的。

总体来说,插入排序等是最慢的,考虑到一般性,堆排序和快速排序都是不错的选择。
如果只是整数,那看情形使用计数或者基数排序,如果是浮点数,那么可以选择桶排序。

Java Web 图书管理系统的制作指南 实现对图书信息的增删改查(CRUD)操作。支持用户登录与权限管理。图书借阅与归还功能。系统管理员可以管理用户信息和图书库存。 阅读详情

相关推荐

精通DC-DC变换器:Boost升压电路全解析

Boost升压变换器是一种将低直流电压转换为高直流电压的常用电路。其核心工作原理是通过电感储能:开关导通时电感充电,关断时电感与电源串联向负载供电。关键公式表明输出电压Vo=Vi/(1-D),占空比D越大,升压比越高。变换器工作时会产生电感电流纹波和输出电压纹波,需合理选择电感和电容参数。开关管和二极管需承受完整的输出电压,对元器件选型要求较高。理解这些原理是设计高效升压电源的基础。

2511_92918351的博客 3708

《算法导论的Java实现》 7 堆排序

《算法导论的Java实现》的第7章----堆排序

chen09的专栏 3842

SAP MTO实战:从销售订单到生产订单的精准触发与配置详解

本文深入解析SAP系统中按订单生产(MTO)模式的核心流程与配置。详细阐述了如何通过精准配置物料主数据策略组、需求类型及计划策略(如策略50),实现从销售订单自动触发生产订单的完整链路。文章结合实战案例,指导用户打通销售与生产环节,并提供了关键事务代码与常见问题排查指南,助力企业实现以销定产,优化库存与成本控制。

weixin_29300931的博客 214

【算法导论】【排序】—— 计数排序(counting sort)

计数排序的特点: 需要额外的数组以存储: 中间过程数据(记为数组 C),数组 C 的下标是待排序序列的元素值,下标对应的值为出现的次数; 排序后的序列(记为 B),计数排序仅获取原始待排序序列的值,对原始序列不做 in-place 处理; 计数排序首先统计原始序列各个数(按顺序,也就是索引)出现的次数,需要获取原始序列的最大值,作为计数数组的区间长度; def counting_sort...

1715

高通Camx功能feature分析之八:高通NCS服务之架构和初始化

本文介绍了高通NCS(NONCameraSensor)服务的架构与初始化流程。NCS服务通过QMI接口访问非相机传感器,为CameraEIS、AEC等算法节点提供陀螺仪、加速度计等传感器数据支持。文章详细解析了NCS服务的分层架构,包括客户端、服务端、QSEE接口实现等组件,并重点分析了初始化过程中获取传感器列表、查询能力等关键步骤。通过camxsetting.xml中的enableNCSService开关控制服务启动,初始化过程涉及QSEE单例创建、传感器能力查询等核心操作。后续文章将继续深入讲解相关技术

929

Python爬虫应对Cloudflare防护:5秒盾+Turnstile验证码实战(AST反混淆+指纹模拟,成功率95%)

Cloudflare 5秒盾+Turnstile验证码的防护核心,是通过“前端JS挑战+多维度指纹校验”确认请求来源的真实性。用AST反混淆还原CF的验证逻辑,避免执行无用代码导致的验证失败;基于真实浏览器采集指纹,确保指纹维度100%匹配真人环境;结合轻量级JS引擎和自动化工具,模拟完整的浏览器执行环境。该方案的绕过成功率可达95%(剩余5%主要是IP或请求频率导致的风控),适用于绝大多数部署CF防护的网站。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1717

《算法导论》——计数排序Counting Sort

  今天贴出的算法是计数排序Counting Sort。在经过一番挣扎之前,我很纠结,今天这个算法在一些scenarios,并不是最优的算法。最坏情况和最好情况下,时间复杂度差距很大。   代码CountingSort.h: #include <stdlib.h> namespace dksl { void Sort(int *numArray,int le...

weixin_30248399的博客 306

使用Simulink设计并实现一个可调谐的二阶IIR陷波滤波器,实时去除音频中的工频噪声

《基于Simulink的音频陷波滤波器设计与实现》摘要:本文详细介绍了使用Simulink设计陷波滤波器去除音频工频噪声(如50Hz)的方法。核心内容包括:1)二阶IIR陷波滤波器的原理与传递函数;2)Simulink实现步骤(音频系统搭建、滤波器设计、频率跟踪);3)性能分析(频谱对比、时域波形、听觉测试)。通过精准消除特定频率干扰,同时保留语音信号(200Hz-4kHz),有效提升信噪比(>20dB)。文章还探讨了多陷波级联、自适应算法等高级技巧,为音频处理、语音通信等应用提供实用解决方案。

amy_mhd的博客 154

线性时间选择算法(Java)

线性时间选择算法(Java)线性时间选择算法方法一分析代码方法二 线性时间选择算法 最近算法课的知识点之一,自己以前没遇见过(是我菜了没错),这次写一篇。 那么什么是线性时间选择呢???一句话,在线性时间内完成选择。 一般情况下是这样的,我们想要找出一个数组中的最大值或最小值,那就只需要一次排列,然后输出第一个或最后一个元素就行了,但如果是要找出一个数组中的第k小的元素呢? 在某些特殊情况下,...

滑技工厂的博客 6804

【零基础入门unity游戏开发——unity通用篇14】unity特性相关的知识(基于unity6开发介绍)

unity特性相关的知识(基于unity6开发介绍)

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1204

在 SAP ABAP 里可靠地对接 FTP 服务器:从连接、命令到传输与排错的完整实战

本文详细介绍了在SAP ABAP中实现FTP文件交换的完整技术方案。文章首先解析了FTP协议的双连接特性(控制连接与数据连接),强调保持控制连接的重要性。随后详细说明了ABAP中FTP操作的四步标准流程:建立连接(包含HTTP_SCRAMBLE加密)、执行命令、断开连接和关闭RFC通道。文章提供了实战案例代码,演示如何将FTP文件复制到应用服务器再读取进内表处理,特别指出后台作业与前台操作的关键差异。最后总结了常见错误排查要点,包括连接模型、路径设置和资源释放等问题。全文通过SAP标准函数模块的调用顺序、典

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 307

算法导论 第9章 中位数和顺序统计学(线性时间选择算法)

/* * 算法导论 第九章 中位数和顺序统计学 * 线性时间选择元素 */ #include #include using namespace std; int minimum(int *arr, int len); int randomizedSelect(int *arr, int p, int r, int i); int randomizedPartition(int *ar

程序缘 3032

【AUTOSAR-CanNM】-3.1-如何让ECU发出的首帧是NM帧(Tx Nm报文先于Tx App应用报文发出)

如何让ECU发出的首帧是NM帧(Tx Nm报文先于Tx App应用报文发出)

「汽车电子助手」的博客 4724

算法导论第八章线性时间排序学习总结

本章围绕四小节展开,第一小节证明任何比较排序在最坏情况下都要经过Ω(nlgn) 次比较,第二、三、四小节分别讨论计数排序、基数排序、桶排序三种线性时间复杂度的排序算法。 排序算法的下界 比较排序算法具备的性质:在排序的最终结果中,各元素的次序依赖于它们之间的比较。 比较排序可以被抽象为一棵决策树,决策树是一棵完全二叉树,它可以表示在给定输入规模情况下,某一特定排序算法对所有元素的比较操作。 定理:在最坏情况下,任何比较排序算法都需要做Ω(nlgn) 次比较。 推论:堆排序和归并排序都是渐进最优的比较排序算法

weixin_44062852的博客 331

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

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

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

java线性排序,算法导论-排序(四)计数排序(线性时间排序)

算法导论-排序(四)计数排序(线性时间排序)目录1、计数排序介绍2、流程图3、代码实现4、性能分析5、参考资料内容1、计数排序介绍什么是计数排序?计数排序是一种特殊的排序算法,之前介绍的排序算法需要对数进行两两比较,效率下界为θ(nlgn); 而计数排序不需要对数进行比较就可以进行排序;很神奇吧,只需要对待排序数组进行遍历就可以排序,效率为Θ(n)。。哈哈,那么神奇,下面开讲!!!!限制:计数...

weixin_42445810的博客 134

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

算法导论 java版_《算法导论》第二章demo代码实现(Java版)

《算法导论》第二章demo代码实现(Java版)前言表示晚上心里有些不宁静,所以就写一篇博客,来缓缓。囧拜读《算法导论》这样的神作,当然要做一些练习啦。除了练习题与思考题那样的理论思考,也离不开编码的实践。所以,后面每个章节,我都会尽力整理出章节中涉及的算法的Java代码实现。二分查找算法实现package tech.jarry.learning.test.algorithms.binarysea...

weixin_42350101的博客 239

VB摄像头监控

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

计数排序 (线性时间排序之基数排序,计数排序及java实现)

先介绍一下概念   计数排序和基数排序都是非比较排序,就是不用进行比较就能排序,相对于堆排序,快速排序,插入排序等都是比较排序,比较排序算法的最坏情况下届都要做0(nlgn)次的比较,堆排序和合并排序都是渐近最有的比较排序算法,线性时间排序的时间复杂度都是O(n)。   计数排序的基本思想,假设n个输入元素中的每一个都是介于0到k的整数,此处k为某个整数。当k=O(n)时,计数排序运行时间是O

学习记录 1007

《算法导论》中算法的部分实现[GitHub]

Introduction to Algorithms介绍GitHub地址 阅读《算法导论》过程中实现的部分算法(Java版)。已实现的算法(后续持续更新。。。) chapter 2插入排序 归并排序 chapter 3最大子数组问题 chapter 6堆 数据结构 堆排序 chapter 7快速排序 快速排序(随机增强版) chapter 8计数排序 桶排序 基数排序 chapter 9期望为线性

INotWant的博客 1759

《算法导论》读书笔记5(线性时间排序)

算法导论的第八章是:线性时间排序   我们共分析过四个排序算法:插入排序,归并排序,堆排序以及快递排序,它们有一个共同点,就是都是基于比较的,都属于比较排序算法   通过决策树模型,可以知道比较排序算法的最坏情况下的下界是:nlog(n)   上面的话有点拗口,下面进行简单的分析   决策树,是一棵满二叉树,排序的过程就像从根走到叶的过程, 因为不是小于等于就是大于嘛,所以不是...

笨笨的专栏 205

算法学习之排序学习之基数排序,计数排序及java实现

先介绍一下概念   计数排序和基数排序都是非比较排序,就是不用进行比较就能排序,相对于堆排序,快速排序,插入排序等都是比较排序,比较排序算法的最坏情况下届都要做0(nlgn)次的比较,堆排序和合并排序都是渐近最有的比较排序算法,线性时间排序的时间复杂度都是O(n)。   计数排序的基本思想,假设n个输入元素中的每一个都是介于0到k的整数,此处k为某个整数。当k=O(n)时,计数排序运行时间是O

逆风奔跑。。不要去考虑什么天赋异禀,一切都来自经历和渴望。 1903

选择问题——算法导论(10)

1. 引言 这一篇我们来探讨选择问题。 它的提法是: 输入:一个包含n个(互异)数的序列A和一个数i(1≤i≤n)。 输出:元素x(x∈A),且A中有i-1个元素比x小。 简单的说,就是在A中找到第i小的数。 2. 期望为线性时间的选择算法 (1) 算法描述与实现 我们先给出算法的伪代码描述: 其主要思想与我们前面介绍的快速排序...

dayin201608的博客 288

算法导论相关

/articles/mm/mm_10_2_04/index.html[/url] [url]http://zh.wikipedia.org/zh-cn/P/NP%E9%97%AE%E9%A2%98[/url] 《算法导论》读书笔记1(算法入门) [url]http://bencode.iteye.com/blog/546018[/url] 《算法导论》读书笔记2(复杂度的表示,递归,以及概率) [url]http://bencode.iteye.com/blog/556

我的博客 151

大数据算法导论课程大纲

程序=算法+数据结构,算法是程序员,数据分析师等岗位的基本功,但有很多程序员和半路出家的数据分析师却没受过严格的算法训练,因此他们不能设计和开发出逻辑复杂的高效率应用系统,使到自己的职业前途受到限制。另外,在面试软件工程师,算法设计师,数据分析师,大数据程序员等岗位的时候,面试官常会问一下算法的问题,没有算法修养的人往往哑口无言,场面尴尬,比如十道海量数据处理面试题 http://f.datagu

网瘾少年沐安涂 1030

Java 桶排序,详细分析

一、简介 桶排序也是时间复杂度仅为 O(n) 的一种排序方法,它假设输入数据服从均匀分布,我们将数据分别放入到 n 个桶内,先对桶内数据进行排序,然后遍历桶依次取出桶中的元素即可完成排序。 和计数排序类似,桶排序也对输入数据作了某种假设,因此它的速度也很快。具体来说,计数排序假设了输入数据都属于一个小区间内的整数,而桶排序则假设输入数据是均匀分布的,即落入每个桶中的元素数量理论也是差不多的,...

阿飞的博客 1万+

《算法导论读书笔记》第二部分 第六章 堆排序

第二部分 排序和顺序统计量 这一部分介绍了几种解决如下排序问题的算法: 即输入n个数的序列,输出排列好的序列 数据的结构 名词:记录(record),关键字(key),卫星数据(satellite data) … 为什么要排序 很多计算机科学家认为排序是算法研究中最基础的问题,其原因有很多: 有时应用本身就需要对信息进行排序。 很多算法通常把排序作为关键子程序。 现有的排序算法数量非常庞大,其中所使用的技术也非常丰富。 我们可以证明排序问题的一个非平凡下界(在第8章中,我们会给出证明.

wg_cheeky的博客 1853
上一篇: 《算法导论的Java实现》 8 快速排序
下一篇: 《算法导论的Java实现》 10 中位数和顺序统计学
chen09
博客等级 码龄19年 158粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值