数据结构与算法之基数排序


目录

  1. 基数排序介绍
  2. 基数排序思想分析
  3. 代码实现
  4. 基数排序的说明

1. 基数排序介绍

  1. 基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用

  2. 基数排序法是属于稳定性的排序,基数排序法的是效率高的稳定性排序法

  3. 基数排序(Radix Sort)是桶排序的扩展

  4. 基数排序是1887年赫尔曼·何乐礼发明的。它是这样实现的:将整数按位数切割成不同的数字,然后按每个位数分别比较。


2. 基数排序思想分析

  1. 将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。这样说明,比较难理解,下面我们看一个图文解释,理解基数排序的步骤

  2. 基数排序图文说明
    将数组 {53, 3, 542, 748, 14, 214} 使用基数排序, 进行升序排序。



3. 代码实现

import java.util.Arrays;public class RadixSort {public static void main(String[] args) {int[] arr = {53, 3, 542, 748, 14, 214};System.out.println("排序前:" + Arrays.toString(arr));radixSort(arr);System.out.println("排序前:" + Arrays.toString(arr));}//基数排序public static void radixSort(int[] arr) {//1.得到数组中最大的数的位数int max = arr[0];for (int i = 0; i < arr.length; i++) {if (arr[i] > max) {max = arr[i];}}//2. 得到最大数是位数int maxLength = (max + "").length();//定义一个二维数组,表示10个桶,每个桶就是一个一维数组//说明//1. 二维数组包含10个一位数组//2. 为了防止在放入数的时候,数据溢出,则每个一位数组(桶),大小定arr.length//3. 明确,基数排序是使用空间换时间的经典算法int[][] bucket = new int[10][arr.length];//为了记录每个桶中,实际存放了多少个数据,我们定义一个一位数组来记录各个桶的每次放入的数据//bucketElementCount[0] 记录的就是bucket[0]桶的放入数据的个数int[] bucketElementCount = 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][bucketElementCount[digitOfElement]] = arr[j];bucketElementCount[digitOfElement]++;}//按照这个桶的顺序(一维数组的下标依次取出数据,放入原来数组)int index = 0;//遍历每一个桶,并将桶中输入,放入到原数组for (int k = 0; k < bucketElementCount.length; k++) {//如果桶中有数据,我们才放入到原数组if (bucketElementCount[k] != 0) {//循环该桶即第k个桶(即第k个一维数组)放入for (int l = 0; l < bucketElementCount[k]; l++) {//取出元素放入arrarr[index++] = bucket[k][l];}}//第i+1轮处理后,需要将每个bucketElementCount[k]=0bucketElementCount[k] = 0;}
//            System.out.println("第"+(i+1)+"轮:"+Arrays.toString(arr));}}
}

编译结果:


4. 基数排序的说明:

  1. 基数排序是对传统桶排序的扩展,速度很快.

  2. 基数排序是经典的空间换时间的方式,占用内存很大, 当对海量数据排序时,容易造成 OutOfMemoryError 。

  3. 基数排序时稳定的。[注:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的]

  4. 有负数的数组,我们不用基数排序来进行排序, 如果要支持负数,参考: https://code.i-harness.com/zh-CN/q/e98fa9

数据结构与算法之基数排序相关推荐

  1. 数据结构与算法详解(含算法分析、动图图解、Java代码实现、注释解析)

    数据结构和算法的重要性 算法是程序的灵魂,优秀的程序可以在海量数据计算时,依然保持高速计算 数据结构和算法的关系: 程序 = 数据结构 + 算法 数据结构是算法的基础, 换言之,想要学好算法,需要把数 ...

  2. Hark的数据结构与算法练习之基数排序

    算法说明 基数排序是基于计数排序的,所以看这个之前要先看一下计数排序对于理解基数排序是很有帮助的(发现计数和基数的音节几乎一致啊).这个我有写,请点击. OK,现在你肯定已经熟悉了计数排序,那么我就来 ...

  3. 数据结构之排序算法:基数排序

    排序算法:基数排序 思维导图: 基数排序的定义: 分配和收集: 基数排序的性能: 基数排序应用: 思维导图: 基数排序的定义: ps: n表示线性表长度 d表示每个元素的位数,例324有三位数字 r表 ...

  4. 数据结构与算法的八股文自述(持续更新)

    数据结构与算法的八股文自述 1.1 排序算法 冒泡排序: 冒泡排序只会操作相邻的两个数据.每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系要求.如果不满足就让它俩互换.一次冒泡会让至少一个 ...

  5. 可视化的数据结构和算法

    导读:作者陈皓之前写过关于可视化排序的一篇文章,现在他又给大家罗列出可视化的数据结构和算法来供大家学习参考.文中分别从基础.索引.排序.动态编程等方面进行描述. 文章内容如下: 还记得之前发布过的那个 ...

  6. 数据结构与算法笔记 —— 十大经典排序及算法的稳定性

    一.十大经典排序算法 排序算法是<数据结构与算法>中最基本的算法之一. 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全 ...

  7. 买什么数据结构与算法,这里有:动态图解十大经典排序算法(含JAVA代码实现)

    上篇的动图数据结构反响不错,这次来个动图排序算法大全.数据结构与算法,齐了. 几张动态图捋清Java常用数据结构及其设计原理 本文将采取动态图+文字描述+正确的java代码实现来讲解以下十大排序算法: ...

  8. 数据结构常见算法集锦

    数据结构经典算法集锦 第2章 线性表 KMP算法 //获得next数组 void GetNext(char *t, int next[MAX]) {int i = 1, j = 0;next[1] = ...

  9. 数据结构经典算法集锦

    数据结构经典算法集锦 第2章 线性表 KMP算法 //获得next数组 void GetNext(char *t, int next[MAX]) {int i = 1, j = 0;next[1] = ...

最新文章

  1. HTML5手机端弹窗、提示框、loading加载(多功能xwPop弹窗升级版)
  2. Spring2.5的新特性
  3. 中国血液制品行业供给预测与投资风险分析报告2022版
  4. 转发萌新人鱼博客-Java面向对象-面向对象编程之基本概念
  5. P2947-[USACO09MAR]向右看齐Look Up【单调栈】
  6. python获取某文件路径_Python获取当前文件路径
  7. 基于vue.js的dialog插件art-dialog-vue2.0发布
  8. 储能系统双向DCDC变换器蓄电池充放电仿真模型有buck模式和boost模式,依靠蓄电池充放电维持直流母线电压平衡
  9. Fragstats|单一土地利用类型景观格局指数
  10. 控制工程实践(7)——PID四种类型控制器(之比例控制器P)
  11. HoloWAN网络仿真损伤仪的基本功能及图解
  12. oracle简单函数的写法,Oracle 简单函数
  13. 唐诗欣赏静夜思用html设计,静夜思-古诗翻译译文赏析-李白诗歌网
  14. NYOJ1016:德莱联盟(判线段相交)
  15. 博客秘诀:超人气博客是怎样炼成的(提升博客人气不可不用的绝招)
  16. 云端服务器跑python代码,断开后台运行
  17. PHp猴子偷,这些猴子成精了!偷东西偷得很萌很认真……
  18. 视频教程-Python数据分析(统计分析)视频教程-机器学习
  19. Java radius源码_Java开发的radius server服务端
  20. 简单远程控制 Metasploit应用

热门文章

  1. J2EE从头开始__EJB3
  2. 在HTML5网页中写法正确的是,跟永哥学HTML5(4):正确使用HTML5的header、hgroup和section...
  3. android 按钮吐司,Android控件系列之Toast使用介绍
  4. 程序员初试和复试_程序员因肌肉发达面试被质疑能力,网友:这做程序员有啥关系呢?...
  5. tensorflow包_在Keras和Tensorflow中使用深度卷积网络生成Meme(表情包)文本
  6. hive 自定义元数据表_Hive分区表和桶表的使用
  7. MySQL 中存储时间的最佳实践
  8. 数据结构与算法 | 插值查找
  9. linux中sz和rz的使用,在服务器和本地之间传输数据
  10. Linux调度系统全景指南(中篇)