Java计数排序知识点(含面试大厂题和源码)

计数排序(Counting Sort)是一种线性时间复杂度的排序算法,适用于整数数据。它的基本思想是将输入的数据值转化为键存储在额外开辟的数组空间中。计数排序不是基于比较的排序算法,因此它可以突破 O(n log n) 的时间下界,实现线性时间排序。

计数排序的工作原理:

  1. 找出待排序数组的最大值和最小值:确定统计数组的长度和初始化统计数组。
  2. 统计数组中每个值出现的次数:遍历待排序数组,统计每个元素出现的次数,存入统计数组对应的索引位置。
  3. 根据统计数组得到排序后的数组:遍历统计数组,按照元素出现的次数依次将元素放入新的数组中。

计数排序的适用条件:

  • 待排序数组中的元素是整数,且范围不是很大。
  • 待排序数组中的元素重复次数较多,且分布较为集中。

计数排序的优缺点:

优点

  • 计数排序可以突破 O(n log n) 的时间下界,实现线性时间复杂度 O(n + k),其中 n 是待排序数组的长度,k 是数组中的最大值。
  • 计数排序是稳定的排序算法,相同元素的相对位置不会改变。

缺点

  • 计数排序需要额外的空间来存储计数数组,空间复杂度为 O(k),其中 k 是待排序数组中的最大值。
  • 当元素是负数或者范围很大时,计数排序的效率会降低。

计数排序的Java实现:

public class CountingSort {public int[] countingSort(int[] arr) {if (arr == null || arr.length == 0) {return arr;}// 找出数组的最大值和最小值int max = Arrays.stream(arr).max().getAsInt();int min = Arrays.stream(arr).min().getAsInt();// 初始化计数数组int range = max - min + 1;int[] count = new int[range];for (int value : arr) {count[value - min]++;}// 根据计数数组得到排序后的数组int[] sortedArr = new int[arr.length];int index = 0;for (int i = 0; i < count.length; i++) {for (int j = 0; j < count[i]; j++) {sortedArr[index++] = i + min;}}return sortedArr;}public static void main(String[] args) {CountingSort countingSort = new CountingSort();int[] arr = {3, 1, 2, 0, 2, 1};int[] sortedArr = countingSort.countingSort(arr);System.out.println("Sorted array: " + Arrays.toString(sortedArr));}
}

在实际应用中,计数排序特别适合于处理大量重复数据的数组排序问题。例如,对于一个学生成绩的数组,使用计数排序可以快速地按照成绩进行排序。在面试中,了解和掌握计数排序的原理和实现是非常有益的。计数排序主要适用于整数数据的排序,特别是当数据范围不是很大,且重复元素较多时,计数排序能够提供非常高效的解决方案。以下是三道与计数排序相关的面试题目,以及相应的Java源码实现。

题目 1:固定范围的整数排序

描述
给定一个整数数组,数组中的元素范围在 [0, k] 之间,你需要对这个数组进行排序。

示例

输入: nums = [4, 2, 2, 6, 1, 0], k = 7
输出: [0, 1, 2, 2, 4, 6]

Java 源码

public class FixedRangeSort {public int[] sortIntegers(int[] nums, int k) {if (nums == null || nums.length == 0) {return nums;}// 初始化计数数组int[] count = new int[k + 1];for (int num : nums) {count[num]++;}// 根据计数数组得到排序后的数组int[] sortedArr = new int[nums.length];int index = 0;for (int i = 0; i <= k; i++) {while (count[i] > 0) {sortedArr[index++] = i;count[i]--;}}return sortedArr;}public static void main(String[] args) {FixedRangeSort solution = new FixedRangeSort();int[] nums = {4, 2, 2, 6, 1, 0};int k = 7;int[] sortedArr = solution.sortIntegers(nums, k);System.out.println("Sorted array: " + Arrays.toString(sortedArr));}
}

题目 2:最少数量的硬币更改

描述
给定一个硬币系统,coins = [1, 2, 5],表示你可以用 1,2,和 5 元硬币来支付。给定一个总金额 amount,询问你需要的最少硬币数量。
如果没有任何硬币可以达到总金额,则返回 -1。

示例

输入: coins = [1, 2, 5], amount = 11
输出: 3 (11 = 5 + 5 + 1)

Java 源码

public class MinCoinChange {public int minCoinChange(int[] coins, int amount) {int[] count = new int[amount + 1];// 初始化计数数组,count[i] 表示达到金额 i 需要的最少硬币数for (int i = 1; i <= amount; i++) {count[i] = Integer.MAX_VALUE;}// 0 金额不需要硬币count[0] = 0;for (int i = 1; i <= amount; i++) {for (int coin : coins) {if (i - coin >= 0 && count[i - coin] != Integer.MAX_VALUE) {count[i] = Math.min(count[i], count[i - coin] + 1);}}}return count[amount] == Integer.MAX_VALUE ? -1 : count[amount];}public static void main(String[] args) {MinCoinChange solution = new MinCoinChange();int[] coins = {1, 2, 5};int amount = 11;int result = solution.minCoinChange(coins, amount);System.out.println("Minimum coins needed: " + result);}
}

题目 3:统计元素出现次数

描述
给定一个整数数组,统计数组中每个元素出现的次数。

示例

输入: nums = [1, 1, 3, 4, 4, 4, 5]
输出: [2, 1, 0, 3, 3, 0, 1]

Java 源码

public class CountElementFrequency {public int[] countElementFrequency(int[] nums) {if (nums == null || nums.length == 0) {return new int[0];}int max = Arrays.stream(nums).max().getAsInt();int[] count = new int[max + 1];for (int num : nums) {count[num]++;}// 过滤掉从未出现过的元素return Arrays.stream(count).filter(c -> c > 0).toArray();}public static void main(String[] args) {CountElementFrequency solution = new CountElementFrequency();int[] nums = {1, 1, 3, 4, 4, 4, 5};int[] frequencies = solution.countElementFrequency(nums);System.out.println("Element frequencies: " + Arrays.toString(frequencies));}
}

这些题目和源码展示了计数排序在不同场景下的应用,包括基本的排序问题、硬币找零问题以及统计元素出现次数问题。在面试中,能够根据问题的特点选择合适的算法并实现其解决方案是非常重要的。希望这些示例能够帮助你更好地准备面试!

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

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

相关文章

关于举办第十五届蓝桥杯全国软件和信息技术专业人才大赛——视觉艺术设计赛的通知

各高等院校及相关单位&#xff1a; 为贯彻落实《中国教育现代化2035》和《国务院关于推进文化创意和设计服务与相关产业融合发展的若干意见》&#xff0c;加快数字内容产业发展&#xff0c;推动文化产品和服务的生产、传播、消费的数字化、网络化进程&#xff0c;强化文化对信…

3.30蓝桥杯备赛写题心得

1.新学到一个东西&#xff0c;将字符串转换为数字的函数stoi&#xff08;string to int 的缩写&#xff09; string str "111111";int a stoi(str);cout << a << endl;//输出111111又用到了字符串截取函数 substr(下标&#xff0c;长度) string s&quo…

Unity Mobile Notifications推送问题

1.在部分机型点击通知弹窗进不去游戏 把这里改成自己的Activity 2.推送的时候没有横幅跟icon红点 主要是第一句话 注册的时候选项可以选择 defaultNotificationChannel new AndroidNotificationChannel(“default_channel”, “Default Channel”, “For Generic notifica…

一文教你如何轻松领取阿里云优惠券

随着云计算技术的飞速发展&#xff0c;越来越多的企业和个人选择使用阿里云作为他们的云服务提供商。为了吸引更多的用户上云&#xff0c;阿里云推出了各种优惠券和促销活动。本文将教大家如何轻松领取阿里云优惠券&#xff0c;以便在购买阿里云产品和服务时享受更多优惠。 一、…

以比特币脚本来实现SNARK Verifier

1. 引言 前序博客有&#xff1a; 基于BitVM的乐观 BTC bridgeBitVM&#xff1a;Bitcoin的链下合约Bitcoin Bridge&#xff1a;治愈还是诅咒&#xff1f;BitVM2&#xff1a;比特币上的无需许可验证 比特币脚本的基础限制有&#xff1a; 最大脚本size为&#xff1a;4MB最大st…

WinServer启用Hyper-V新建虚拟机没有网络、无法开启增强模式、开启远程连接功能

没有网络问题如下&#xff1a; 原因&#xff1a;没有在Hyper-V中新增交换机 操作—虚拟交换机管理器—新建虚拟网络交换机-外部-允许管理员操作系统共享此网络适配器 无法开启增强模式&#xff1a; 开启远程连接功能 或者&#xff1a;

Redis的基本操作

基本操作 redis默认开启16个数据库&#xff0c;默认使用第0个&#xff0c;可以使用select命令切换。 select index # 切换数据库查看当前数据库内所有键值 keys *清空数据库 flushdb # 清空当前数据库 flushall # 清空所有数据库设置键值对 set key value删除键值对 del …

C++:你真的了解匿名对象的生命周期吗?

初步了解匿名对象生命周期 1. 提出问题2. 模拟验证3. 得出结论 不知道有没有人和我一样&#xff0c;在vector的模拟实现部分对于resize接口的实现有一些疑问。 void resize(size_t n , const T& val T()) {if (n > size()){reserve(n);for (size_t i size(); i <…

Kafka开发实录

前言 最近我总是在做大胆的事情&#xff0c;莫不是少年也需要冲冲冲&#xff0c;明明我不是这样的人啊&#xff0c;难不成这就是命运&#xff0c;来自命运石之门的选择&#xff01;废话不多说&#xff0c;本次是Kafka的实战篇&#xff0c;为什么这篇这么快呢&#xff1f;看了开…

golang 在多线程中避免 CPU 指令重排

发布日期&#xff1a;2024-03-26 16:29:39 起因 golang 的发明初衷便是多线程&#xff0c;是一门专门用于多线程高并发的编程语言。其独创的 GMP 模型在多线程的开发上提供了很大的便利。 现代计算机基本上都是多核 CPU 的结构。CPU 在进行指令运行的时候&#xff0c;为了提高…

基于Python的Selenium详细教程

一、PyCharm安装配置Selenium 本文使用环境&#xff1a;windows11、Python 3.10.5、PyCharm 2022.1.3、Selenium 4.3.0 需要你懂的技术&#xff1a;Python、HTML、CSS、JavaScript 1.Seleium安装&#xff1a; 在PyCharm终端或window命令窗口输入以下命令 #查看已安装的Pytho…

git 代码库查看方法

在Git中&#xff0c;你可以使用多种命令来查看代码库&#xff08;repository&#xff09;的内容。以下是一些常用的命令&#xff1a; 查看所有分支&#xff1a; git branch这个命令会列出本地仓库中的所有分支。当前活动的分支前面会有一个星号&#xff08;*&#xff09;。 查…

Python自动连接SSH

Python自动连接SSH 在 Python 中&#xff0c;可以使用 paramiko 模块来编写脚本自动执行 SSH 命令。paramiko 是一个用于 SSHv2 的 Python 实现&#xff0c;可以帮助你在脚本中进行远程执行命令。 首先&#xff0c;确保安装了 paramiko&#xff1a; pip install paramiko然后…

EMD关于信号的重建,心率提取

关于EMD的俩个假设&#xff1a; IMF 有两个假设条件&#xff1a; 在整个数据段内&#xff0c;极值点的个数和过零点的个数必须相等或相差最多不能超过一 个&#xff1b;在任意时刻&#xff0c;由局部极大值点形成的上包络线和由局部极小值点形成的下包络线 的平均值为零&#x…

大话设计模式之工厂模式

工厂模式&#xff08;Factory Pattern&#xff09;是一种创建型设计模式&#xff0c;它提供了一种创建对象的最佳方式&#xff0c;而无需指定将要创建的对象的确切类。通过使用工厂模式&#xff0c;我们可以将对象的创建和使用分离&#xff0c;从而使代码更具灵活性和可维护性。…

酒店能源监测管理系统:实现节能减排与提升管理效率的利器

随着全球能源问题的日益突出和可持续发展理念的深入人心&#xff0c;酒店业也在积极探索节能减排的途径。在这一背景下&#xff0c;酒店能源监测管理系统应运而生&#xff0c;成为了酒店行业提升管理效率、降低能源消耗的重要工具。本文将从多个角度介绍酒店能源监测管理系统的…

第十五届蓝桥杯模拟考试II_物联网设计

反思&#xff1a; 本次模拟让我惊醒&#xff0c;写这个作品如同搭积木&#xff0c;在拼接的时候都要仔细检查这个积木是否出bug,确保没有问题再将其拼接到之前搭好的大模块之中&#xff0c;因为就是这样的题目我在处理过程中就遇到了BUG&#xff0c;原因竟出在输入模式要上拉&…

Android 自定义坐标曲线图(二)

Android 自定义坐标曲线图_android 自定义曲线图-CSDN博客 继上一篇文章&#xff0c;点击折线图上的点&#xff0c;显示提示信息进行修改&#xff0c;之前通过回调&#xff0c;调用外部方法&#xff0c;使用popupwindow或dialog来显示&#xff0c;但是这种方法对于弹框显示的位…

电子产品说明书是什么?要怎么才能制作?

电子产品令人着迷&#xff0c;尤其是最新的技术&#xff0c;这就是为什么市场上充斥着各式各样的电子产品。然而&#xff0c;随着电子产品变得越来越复杂&#xff0c;如何正确、安全地使用它们变得越来越重要。这就涉及到了电子产品说明书的具体内容和如何制作。 电子产品说明书…

Base64编码转为文件

在JavaScript中&#xff0c;将Base64编码的字符串转换为文件通常涉及几个步骤。这通常涉及到创建一个Blob对象&#xff0c;然后使用这个Blob对象来创建一个文件。以下是一个简单的示例&#xff0c;说明如何将Base64字符串转换为文件&#xff1a; javascript function base64To…