数据结构-八大排序之基数排序

基数排序(RadixSort)

1. 理论知识:

1.1 原理

定义0-9 十个桶 (数组),先排序个位,再排序十位,排序百位...

1.2 例子:

①根据最大值确定需要执行多少遍(这里最大值是三位数,所以执行三遍)

②排序个位

首先,遍历数组把数据放入桶中

然后,按照先后顺序取出数据(先从0号桶取数据,取完再下一号桶)

0号桶取出示例:

一轮结束后:

③排序十位

遍历数组放入数据

取出数据

④排序百位

遍历数组放入数据

取出数据

至此 ,排序已完成,得到的数组为排好序的数组。

1.3 时间复杂度

在上述例子里,

排序个位: O(n)

排序十位: O(n)

排序百位: O(n)

故: O(kn)

2. 代码

这里,桶定义为二维数组(十个桶十列,每个桶的长度定义为待排序数组长度<防止出现都到一个桶,长度不够的情况>)

java 复制代码
public class RadixSort {
	public static void main(String[] args) {
		int[] arr= {50,17,41,20,101,35,11,62,25,45,21,45,54,89};
		sort(arr);
		System.out.println(Arrays.toString(arr));
	}
	public static void sort(int[] arr) {
		//取最大值计算最大值的位数
		int max=arr[0];
		for(int j=0;j<arr.length;j++) {
			if(arr[j]>max) {
				max=arr[j];
			}
			
		}
		//最大值的位数
		int maxLen = (max+"").length();
	    
		//定义桶
		int[][] bucket = new int[10][arr.length];
		//定义桶记录工具
		int[] elementCounts= new int[10];
		int n=1;
		//放入取出执行maxLen遍
		for(int m=0;m<maxLen;m++) {
			//遍历数组,将数组中的数据放入桶中
			for(int i=0;i<arr.length;i++) {
				//element代表个位数值,也代表要放入哪个桶
				int element = arr[i]/n%10;
				//读取桶记录中的数值
				int count = elementCounts[element];
				//数据放入
				bucket[element][count]=arr[i];
				//桶记录中的数据加1
				elementCounts[element]++;
				
			}
			//将桶中的数据取出
			int index=0;//定义index游标,遍历待排序数组
			for(int k=0; k<elementCounts.length;k++) {
				if(elementCounts[k]!=0) {
					//桶中有数据,将数据取出
					for(int l=0;l<elementCounts[k];l++) {
						arr[index] = bucket[k][l];
						index++;
					}
				}
				//清空桶记录
				elementCounts[k]=0;
			}
			n=n*10;
		}
		
	}
}
相关推荐
ll7788112 小时前
C++学习之路,从0到精通的征途:继承
开发语言·数据结构·c++·学习·算法
Akiiiira3 小时前
【数据结构】栈
数据结构
c6lala3 小时前
数据结构day1
数据结构
多多*4 小时前
算法竞赛相关 Java 二分模版
java·开发语言·数据结构·数据库·sql·算法·oracle
逐光沧海4 小时前
数据结构基础--蓝桥杯备考
数据结构·c++·算法·蓝桥杯
与己斗其乐无穷9 小时前
数据结构(2)线性表-顺序表
数据结构
周Echo周9 小时前
20、map和set、unordered_map、un_ordered_set的复现
c语言·开发语言·数据结构·c++·算法·leetcode·list
小青龙emmm10 小时前
数据结构(一) 绪论
数据结构
矿渣渣10 小时前
AFFS2 的 `yaffs_ext_tags` 数据结构详解
数据结构·算法·文件系统·yaffs2
chenyuhao202411 小时前
链表的面试题4之合并有序链表
数据结构·链表·面试·c#