0
点赞
收藏
分享

微信扫一扫

排序算法----基数排序

1. 基数排序:基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前

2. 基数排序的时间,空间复杂度及稳定性:

        1>. 时间复杂度:O(n+m)。

        2>. 空间复杂度:S(n+m)。

        3>. 稳定性:稳定。

3. 基数排序的实现:

//基数排序
/*
 * 基数排序就是对数据的每一位的数字进行操作
 * 出桶的顺序类似于队列的出队 先进先出 后进后出
 * 1.先寻出数组中的最大值 并获取最大值的位数(即要入桶和出桶的次数)
 * 2.先将每个数据放入其个位的数对应的桶的编号中
 * 3.再将桶中的数据按照桶编号依次将桶中的数据出桶(先进桶的数据先出桶)
 * 		1.再将每个数据放入其十位的数对应的桶的编号中
 * 		2.再将桶中的数据按照桶编号依次将桶中的数据出桶(先进桶的数据先出桶)
 * 			1.再将每个数据放入其百位的数对应的桶的编号中
 * 			2.再将桶中的数据按照桶编号依次将桶中的数据出桶(先进桶的数据先出桶)
 * 			......
 * 		......
 * ......
 * 按照这样循环直至数组中的最大值的最高位操作结束后将其出桶 添加到原数组中 就是有序数组
 */
public class RadixSort {
	public static void main(String[] args) {
		int[] arr = {233, 53, 10, 7, 4, 69, 433, 53, 18, 100};
		radixSort(arr);
		System.out.println(Arrays.toString(arr));
	}

	//对数组进行基数排序
	private static void radixSort(int[] arr) {
		//1.先获取分类-收集的轮数
		int radix = getRadix(arr);
		//2.创建存放桶的集合 集合中包含十个桶 每一个桶LinkedList按照队列的进出元素规则来操作
		LinkedList<Integer>[] list = new LinkedList[10];
		for(int i = 0; i < list.length; i++) {
			list[i] = new LinkedList<Integer>();
		}
		
		//3.循环分类-收集的轮数 对数组中的数据进行分类-收集
		for(int r = 1; r <= radix; r++) {
			//1>.分类的过程 即为 将数组中的数据依次分入规定的桶中
			for(int i = 0; i < arr.length; i++) {
				//获取数组要分入的桶的编号 并将数字分入对应的桶中
				list[getIndex(arr[i], r)].offer(arr[i]);
			}
			
			//2>.收集的过程 即为 将所有桶中的数据按照顺序 依次放回到原数组中
			int index = 0; //表示原数组中的索引
			
			//将每个桶中的数据依次出队 重新放入原数组arr中 直到每个桶为空
			for(int i = 0; i < list.length; i++) {
				while(!list[i].isEmpty()) {
					arr[index++] = list[i].poll();
				}
			}
		}
	}

	//获取数组要分入的桶的编号 r=1表示个位 r=2表示十位 r=3表示百位 依次类推
	//编号即为数组中元素指定位上的数字
	private static int getIndex(int num, int r) {
		int index = 0;
		for(int i = 1; i <= r; i++) {
			index = num % 10;
			num /= 10;
		}
		return index;
	}

	//获取分类-收集的轮数 即数组中最大数的位数
	private static int getRadix(int[] arr) {
		int max = arr[0];
		for(int i = 1; i < arr.length; i++) {
			if(arr[i] > max) {
				max = arr[i];
			}
		}
		return (max + "").length();
	}
}

4. 运行结果:

 

举报

相关推荐

0 条评论