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

基数排序(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;
		}
		
	}
}
相关推荐
CSCN新手听安32 分钟前
list的常用操作
数据结构·list
梅茜Mercy2 小时前
数据结构:链表(经典算法例题)详解
数据结构·链表
青春男大2 小时前
java栈--数据结构
java·开发语言·数据结构·学习·eclipse
Zer0_on3 小时前
数据结构栈和队列
c语言·开发语言·数据结构
一只小bit3 小时前
数据结构之栈,队列,树
c语言·开发语言·数据结构·c++
我要学编程(ಥ_ಥ)3 小时前
一文详解“二叉树中的深搜“在算法中的应用
java·数据结构·算法·leetcode·深度优先
szuzhan.gy5 小时前
DS查找—二叉树平衡因子
数据结构·c++·算法
一只码代码的章鱼5 小时前
排序算法 (插入,选择,冒泡,希尔,快速,归并,堆排序)
数据结构·算法·排序算法
青い月の魔女6 小时前
数据结构初阶---二叉树
c语言·数据结构·笔记·学习·算法
我要出家当道士6 小时前
Nginx单向链表 ngx_list_t
数据结构·nginx·链表·c