基数排序(桶排序)思路分析及代码实现

十大排序算法总结及Python实现 1、冒泡排序 1.1 思路概述 以升序排序为例,依次对未排序部分两两比较,元素大的放后面,元素小的放前面。每一轮下来,未排序中最大的元素会被冒到未排序区域的最后一个位置,每一轮都会确定当前最大元素的最终位置,该元素确定后,就会从未排序元素中剔除。如果其中某一轮,没有发生元素交换,说明整个未排序数组都已经有序,则完成排序。 1.2复杂度分析 最好的情况是已经有序,则一轮结束,时间复杂度为O(n).最坏情况是逆序排序,则共需要经过n轮排序,每次复杂度为O(n),故时间复杂度为O(n^2).由于是就地.. 阅读详情

基数排序(桶排序)介绍:

  1. 基数排序(RadixSort)属于“分配式排序”(DistributionSort),又称“桶子法”(Bucket Sort)顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用
  2. 基数排序法是属于稳定性的排序,基数排序法的是效率高的稳定性排序
  3. 基数排序(RadixSort)是桶排序的扩展,以空间换取时间。
  4. 基数排序是1887年赫尔曼·何乐礼发明的。它是这样实现的:将整数按位数切割成不同的数字,然后按每个位数分别比较。

基本思想

  1. 将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。
  2. 这样说明,比较难理解,下面我们看一个图文解释,理解基数排序的步骤数组的初始状态arr{53,3,542,748,14,214}
  3. 第一轮排序:
    • 将每个元素的个位数取出,然后看这个数应该放在哪个对应的桶(一个一维数组)
    • 按照这个桶的顺序(一维数组的下标依次取出数据,放入原来数组)
    • 第一轮排序后arr{542,53,3,14,214,748}
      在这里插入图片描述
  4. 第二轮排序:
    • 将每个元素的十位数取出,然后看这个数应该放在哪个对应的桶(一个一维数组)
    • 按照这个桶的顺序(一维数组的下标依次取出数据,放入原来数组)
    • 第二轮排序后arr{3,14,214,542,748,53}
      在这里插入图片描述
  5. 第三轮排序:
    • 将每个元素的百位数取出,然后看这个数应该放在哪个对应的桶(一个一维数组)
    • 按照这个桶的顺序(一维数组的下标依次取出数据,放入原来数组)
    • 第三轮排序后arr{3,14,53,214,542,748}
      在这里插入图片描述特别注意!!! 特别注意!!! 特别注意!!!

有负数的数组,我们不用基数排序来进行排序,如果要支持负数那么我们的代码还需要改进。在取数据的时候进行绝对值选取,存的时候要反转。

代码实现

package com.sort;

import java.util.Arrays;

public class RadixSort {
	public static void main(String[] args) {
		int[] arr = { 53, 3, 542, 748, 14, 214 };
		radixSort(arr);
	}

	public static void radixSort(int[] arr) {
		// 基数排序简化
		// 1.得到最大的位数
		int max = arr[0];// 假设最大数是第一个
		for (int i = 1; i < arr.length; i++) {
			if (arr[i] > max) {
				max = arr[i];
			}
		}
		// 得到最大数是几位数
		int maxLength = (max + "").length();

		// 定义一个二维数组,表示10个桶,每个桶就是一个一维数组
		// 说明
		// 1.二维数组包含10个一维数组
		// 2.为了防止数据溢出,则每个一维数组的大小定义为arr.lenght
		// 3.很明确,基数排序是用空间换时间的经典算法
		int[][] bucket = new int[10][arr.length];

		// 为了记录每个桶中实际存放了多少个数据,我们定义一个以为数组来记录各个桶中的每次放入的数据个数
		// 比如:bucketElementCounts[0]记录的就是bbucket[0]桶的放入数据个数
		int[] bucketElementCounts = new int[10];

		// 使用循环将代码处理
		for (int i = 0, n = 1; i < maxLength; i++, n *= 10) {
			// 排序(针对每一个元素的对应位进行排序处理),第一次 个位,第二次 十位,第三次 百位。。。。。。
			for (int j = 0; j < arr.length; j++) {
				// 取出每个元素对应位的数据
				int digitOfElement = arr[j] / n % 10;
				// 放入到对应的桶中
				bucket[digitOfElement][bucketElementCounts[digitOfElement]] = arr[j];
				bucketElementCounts[digitOfElement]++;
			}
			// 按照这个桶的顺序(一维数组的下标依次取出数据,放入原来数组)
			int index = 0;
			// 遍历每一个桶,并将桶中的数据放入到原数组
			for (int k = 0; k < bucketElementCounts.length; k++) {
				// 如果桶中有数据我们才放入到原数组
				if (bucketElementCounts[k] != 0) {
					// 循环该桶,即第k个一维数组
					for (int l = 0; l < bucketElementCounts[k]; l++) {
						// 取出元素放到arr
						arr[index++] = bucket[k][l];
					}
				}
				// 每一轮处理后需要将每一个bucketElementCounts置0
				bucketElementCounts[k] = 0;
			}
			System.out.println("第" + (i + 1) + "轮,个位排序处理" + Arrays.toString(arr));
		}
/*
		*每一步的思路代码
		
		// 第一轮排序(针对每一个元素的个位进行排序处理)
		for (int j = 0; j < arr.length; j++) {
			// 取出每个元素的个位
			int digitOfElement = arr[j] % 10;
			// 放入到对应的桶中
			bucket[digitOfElement][bucketElementCounts[digitOfElement]] = arr[j];
			bucketElementCounts[digitOfElement]++;
		}
		// 按照这个桶的顺序(一维数组的下标依次取出数据,放入原来数组)
		int index = 0;
		// 遍历每一个桶,并将桶中的数据放入到原数组
		for (int k = 0; k < bucketElementCounts.length; k++) {
			// 如果桶中有数据我们才放入到原数组
			if (bucketElementCounts[k] != 0) {
				// 循环该桶,即第k个一维数组
				for (int l = 0; l < bucketElementCounts[k]; l++) {
					// 取出元素放到arr
					arr[index++] = bucket[k][l];
				}
			}
			// 每一轮处理后需要将每一个bucketElementCounts置0
			bucketElementCounts[k] = 0;
		}
		System.out.println("第1轮,个位排序处理" + Arrays.toString(arr));

		// -------------------------------------------------------
		// 第2轮排序(针对每一个元素的十位进行排序处理)
		for (int j = 0; j < arr.length; j++) {
			// 取出每个元素的十位
			int digitOfElement = arr[j] / 10 % 10;
			// 放入到对应的桶中
			bucket[digitOfElement][bucketElementCounts[digitOfElement]] = arr[j];
			bucketElementCounts[digitOfElement]++;
		}
		// 按照这个桶的顺序(一维数组的下标依次取出数据,放入原来数组)
		index = 0;
		// 遍历每一个桶,并将桶中的数据放入到原数组
		for (int k = 0; k < bucketElementCounts.length; k++) {
			// 如果桶中有数据我们才放入到原数组
			if (bucketElementCounts[k] != 0) {
				// 循环该桶,即第k个一维数组
				for (int l = 0; l < bucketElementCounts[k]; l++) {
					// 取出元素放到arr
					arr[index++] = bucket[k][l];
				}
			}
			// 每一轮处理后需要将每一个bucketElementCounts置0
			bucketElementCounts[k] = 0;
		}
		System.out.println("第2轮,个位排序处理" + Arrays.toString(arr));

		// -----------------------------------------------------
		// 第3轮排序(针对每一个元素的百位进行排序处理)
		for (int j = 0; j < arr.length; j++) {
			// 取出每个元素的百位
			int digitOfElement = arr[j] / 100 % 10;
			// 放入到对应的桶中
			bucket[digitOfElement][bucketElementCounts[digitOfElement]] = arr[j];
			bucketElementCounts[digitOfElement]++;
		}
		// 按照这个桶的顺序(一维数组的下标依次取出数据,放入原来数组)
		index = 0;
		// 遍历每一个桶,并将桶中的数据放入到原数组
		for (int k = 0; k < bucketElementCounts.length; k++) {
			// 如果桶中有数据我们才放入到原数组
			if (bucketElementCounts[k] != 0) {
				// 循环该桶,即第k个一维数组
				for (int l = 0; l < bucketElementCounts[k]; l++) {
					// 取出元素放到arr
					arr[index++] = bucket[k][l];
				}
			}
			// 每一轮处理后需要将每一个bucketElementCounts置0
			bucketElementCounts[k] = 0;
		}
		System.out.println("第3轮,个位排序处理" + Arrays.toString(arr));
		*/
	}
}
TCN(Temporal Convolutional Networks)时序卷积网络详解及代码 阅读详情

相关推荐

ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: NO)解决办法

问题:ERROR 1045 (28000): Access denied for user ‘root’@‘localhost’ (using password: NO) 很久没用这台电脑的mysql了,今天需要连接数据库,启动数据库报错: ERROR 1045 (28000): Access denied for user ‘root’@‘localhost’ (using password: NO) 解决方法: 查阅资料后知道了,应该使用已知的用户名和密码登陆 mysql -u root -p 然而密

一个超会写Bug的程序猿的博客 43万+

数据结构与算法Java实现-16基数排序

基数排序 package aStudy.day6; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Date; /** * @author haoqi * @Date 2020/10/4 - 10:16 * 基数排序 * 桶排序的优化,利用空间换时间 * */ public class data07 { public static void main(String[] args)

浩浩的博客 377

QT+QTimer+QThread实现线程内的定时任务并且和主线程进行交互

在制作qt软件时,我们经常会用到qtimer定时器以及将其在非主线程中进行使用,甚至有的时候还需要和主线程进行交互。我总结了两种用法,仅供参考。以上即为QTimer和QThread联合使用的学习记录。

u011826081的博客 5685

超详细八大排序+基数排序(图文并茂+动图演示+C语言代码演示)

图文详解秒懂各大排序

总结日常学习内容 8334

Circos图审美拯救计划:用TBtools复刻Nature级共线性分析图谱

本文针对Circos图在共线性分析中的审美提升问题,提供了一套基于TBtools的完整优化方案。通过构建和谐的色彩体系、精细控制信息层布局以及模仿顶刊构图逻辑,详细讲解了如何从配色、透明度、标签显示到高级参数设置,将默认图表升级为具有高级学术美感的Nature级图谱,助力研究者提升论文图表质量。

cherry的博客 910

Cadence psspxf实战:手把手教你仿真250MHz环形VCO的电源抑制比(附Verilog代码)

本文详细介绍了使用Cadence psspxf仿真器对250MHz环形VCO的电源抑制比(PSRR)进行仿真的全流程。从环形VCO的设计原理、Verilog代码实现,到Cadence环境配置、仿真参数设置,再到结果分析与优化技巧,提供了完整的实战指南。特别适合电路设计工程师学习如何评估和优化VCO的抗电源噪声能力。

weixin_42567752的博客 414

基数排序(思路分析) [数据结构][Java]

基数排序(radix sort)属于是"分配式排序"(distribution),又称为"桶子法"(bucket sort)或者 bin sort,顾名思义即使通过健值的各个位的值,将要排序的元素分配在某个桶中,达到排序的效果基数排序是属于稳定的排序基数排序(radix sort)是桶排序的扩展基数排序是1887年赫尔曼-何乐礼发明的,它是这样实现的,将整数按位数切割成不同的数值,然后按每个位的数值进行比较,判断到底是要放到哪个桶中。

m0_57001006的博客 252

Python 爬虫实战:解析 JSON 数据爬取今日头条热点新闻(API 接口逆向与字段提取)

在当今信息爆炸的时代,新闻资讯的获取变得尤为重要。今日头条作为国内领先的新闻聚合平台,其热点新闻数据具有很高的价值。本文将详细介绍如何通过 Python 爬虫技术,逆向解析今日头条的 API 接口,提取并解析 JSON 数据,最终获取热点新闻信息。

yansideyucsdn的博客 3210

基数排序算法

一、基数排序算法基本思想 基数排序将所有元素统一为同样的数位长度, 数位较短的数前面补零。然后, 从最低位开始, 依次进行一次排序,这样从最低位排序一直到最高位排序完成以后, 原数组就变成一个有序序列。 二、基数排序图解 三、代码实现 package Sort; import java.util.Arrays; public class RadixSort { public static void radixsort(int[] arr) { int max=arr[0]; for(int

qq_44111805的博客 3797

手把手教你学Simulink--基于Simulink的高速公路自动驾驶场景仿真建模

特点车道保持:自动调整车辆方向以保持在车道中央。自适应巡航控制(ACC):根据前方车辆的速度自动调节车速。换道辅助:安全地变换车道以超过慢速行驶的车辆或准备驶离高速公路。紧急制动:检测潜在碰撞并采取措施避免事故。挑战安全性:确保所有功能在各种条件下都能可靠运行。实时性:处理大量传感器数据,并迅速做出反应。复杂性:集成多个子系统,包括感知、规划与控制。首先明确要模拟的任务内容。车辆需保持在车道内行驶。根据交通情况自动调整速度。安全地执行换道操作。在必要时实施紧急制动。

MHD0815的博客 246

C#实战:从零搭建Vosk离线语音转文字系统

本文手把手教你用C#构建离线语音转文字系统,基于NAudio和Vosk实现全流程开发。首先介绍环境搭建,包括NuGet包安装和中文模型配置,强调16kHz单声道音频格式的关键性。接着详细解析音频预处理转换、Vosk模型初始化及识别过程的核心代码,提供多线程优化建议和实时识别扩展思路。文章包含80%以上代码注释,从常见问题排查到性能优化技巧,完整覆盖从"Hello World"到工业级部署的关键技术点,特别适合需要开发本地化语音识别应用的C#开发者。

墨夶的博客 752

数组排序算法——桶排序(Bucket)算法精讲及python实现

当输入元素个数为 $n$,桶的个数是 $m$ 时,每个桶里的数据就是 $k = n / m$ 个。$m$ 个桶就是 $m * O(k * log_2k) = m \times O((n / m) \times \log_2(n/m)) = O(n*log_2(n/m))$。当桶的个数 $m$ 接近于数据个数 $n$ 时,$log_2(n/m)$ 就是一个较小的常数,所以排序桶排序时间复杂度接近于 $O(n)$。由于桶排序使用了辅助空间,所以桶排序的空间复杂度是 $O(n + m)$。

白话机器学习 1692

Windows11上pip安装IsaacSim5.1.0与IsaacLab

本文详细介绍了CUDA Toolkit 12.8.0、IsaacSim和IsaacLab的安装过程。首先从NVIDIA官网下载并安装CUDA Toolkit 12.8.0,然后通过miniforge创建conda环境(env_isaacsim)安装IsaacSim相关Python包,解决了Windows长路径问题。成功运行IsaacSim后,克隆IsaacLab仓库并完成安装验证,最后通过创建空场景测试环境配置。整个安装过程包含详细的命令行操作和问题解决方法,为机器人仿真开发环境搭建提供了完整指导。

拥抱具身智能,昇腾Ascend C 375

基数排序

它的基本思想是:将整数按位数切割成不同的数字,然后按每个位数分别比较。具体来说,就是将数列分别按个位,十位,百位... 的大小顺序排序,最后组合在一起。具体实现过程中,使用了一个二维数组作为桶,桶的第一维是数字的每一位,第二维是存储这一位数字相同的数字的数组。基数排序是桶排序的扩展,用于整数排序,与桶排序相比,其多了一重循环,用于不同数位的比较。基数排序适用于整数排序,特别是位数大小不一的整数排序,比如电话号码、银行卡号等。总体来说,基数排序是一种非常有效的整数排序算法,特别是对于大量数,很长的数列。

qq_67031246的博客 1003

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

深入理解基数排序:原理、实现与应用

在排序算法的世界里,基数排序犹如一颗独特的明珠。它作为桶排序的一种特例,以其独特的分配和收集过程,为特定场景下的数据排序提供了高效的解决方案。今天,就让我们一同深入探索基数排序的奥秘。

m0_57836225的博客 726

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

线性排序算法分析总结

线性排序(Linear sort),指的是 时间复杂度为 O(n) 的排序算法。之所以时间复杂度能达到线性,是因为这种排序不是基于比较的,但它的适用场景也有很大的局限性。 线性排序有三种:桶排序、计数排序、基数排序。 复杂度总结 排序算法 时间复杂度 空间复杂度 是否稳定 桶排序 O(n) O(n) 稳定 计数排序 O(n) O(n+k) 稳定 基数排序 O(k*n) ...

weixin_34319640的博客 462

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

数据结构 十大排序超硬核八万字详解【附动图演示、算法复杂度性能分析】

对于文件中的数据,一般都是很大的,不像我们上面所讲的十二十个数,可能会有成千上百的数据需要我们去排序,此时效率最高的就是【归并排序】了,因为面对海量的数据而言,像效率较高的【快速排序】需要克服三数取中的困难,还有像【堆排序】【希尔排序】这些,都无法支持随机访问,所以很难去对大量的文件进行一个排序,速度会非常之慢。即使是有文件函数【fseek()】这样的函数可以使文件指针偏移,还是很难做到高效。因为磁盘的速度比起内存差了太多太多了,具体的我不太清楚大概有差个几千倍这样,

2401_84182073的博客 731

常见简单排序算法的实现

常见简单排序算法的实现: 冒泡排序BubbleSort,选择排序SelectionSort,插入排序InsertSort,桶排序BucketSort,基数排序RadixSort。

Denluoyia的专栏 250

【春招】十大经典排序算法

文章目录1、冒泡排序1.1 算法思路1.2 代码实现1.3 链接2、选择排序2.1 算法思路2.2 代码实现2.3 算法分析2.4 链接3、插入排序3.1 算法思路3.2 代码实现3.3 算法分析3.4 链接4、希尔排序4.1 算法思路4.2 代码实现4.3 算法分析4.4 链接5、归并排序5.1 算法思路5.2 代码实现5.3 算法分析5.4 链接6、快速排序6.1 算法思路6.2 代码实现6.3 链接7、堆排序7.1 算法思路7.2 代码实现8、计数排序1.1 算法思路1.2 代码实现9、桶排序1.1

金金金金金的博客 705

教小学妹学算法:十大经典排序算法深度解析

Hello,我是 Alex 007,一个热爱计算机编程和硬件设计的小白,为啥是007呢?因为叫 Alex 的人太多了,再加上每天007的生活,Alex 007就诞生了。 最近有一位小学妹 Coco 入坑了算法,结果上来就被几个排序算法给整懵逼了,各种排序眼花缭乱,也分不清什么时候该用什么排序了,于是哭着来找我来了。 咳咳,我是一个没有感情的coder,只是单纯的给她讲了算法。 今天呢,就在...

Alex 1873

刷题(3)-排序(2)

目录 2. 归并排序 (稳定) 3.冒泡排序(稳定) 4.选择排序 5.插入排序 (稳定) 6. 希尔排序 7. 堆排序 8. 桶排序(不基于比较,稳定) 8.1 计数排序 8.2.基数排序(稳定) 2. 归并排序 (稳定) 复杂度: 时间O(NlogN) 空间O(N) 保证稳定性。 思想:首先考虑一个数组 【first,mid】 【mid+1,last】都排好序了...

speargod的博客 750

【数据结构】 排序算法

数据结构中的排序算法及实现

qq_56251766的博客 1177

排序算法总结

排序算法总结 1.冒泡排序 1)算法思路 每次从第一个数开始,比较相邻两个数的大小,如果第一个数比第二个数大,则交换,每趟之后最大的元素放在了最后的位置,重复以上步骤除了最后一个元素,直到没有任何一对数字需要比较。 2)算法实现 public class BubbleSort { public static void bubbleSort(int[] arr){ if(arr == null...

gkq_tt的博客 147

Python————排序算法

排序算法 一、排序算法常用术语 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面; 不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面; 内排序:所有排序操作都在内存中完成; 外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行; 排序算法性能的三大影响因素 时间性能(时间复杂度): 一个算法执行所耗费的时间。 辅助空间 (空间...

weixin_41460135的博客 941

【排序算法】Java版十大经典排序算法实现以及测试结果

    排序算法是程序员必备技能之一,可能大家平时用到的排序算法种类比较少,完全忽视了运行时的时间空间效率问题,不过,作为一个进阶的程序员,了解各排序算法的优缺点以及实现思路很有必要,先列出常用的十大算法的概况:     算法的优劣性取决于具体需要排序的数组的大小,混乱程度,数组内容,业务需求等等,我们不能离开应用场景去评判一个算法的优劣性,没有最好,只有最适合。     以下是在Java...

不忘初心 536

十大常见排序算法

本文为十大常见排序算法思路介绍 + 代码实现,如有错误,欢迎指出,希望和大家一起共同学习进步。

SKYoungForever的博客 410
上一篇: 归并排序思路分析及代码实现
下一篇: 查找算法之二分查找思路分析及代码实现
lu_long
博客等级 码龄8年 11粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值