20、基数排序

本文详细介绍了基数排序的原理和实现过程,通过使用额外的空间来换取排序效率的提升,适用于整数排序。文章展示了如何利用二维数组和一维数组进行个位、十位、百位等的排序,最后给出了完整的Java代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 思想:
用空间换时间,他用一个二维数组(10*n)和一位数组(1*10),用于排序的道具,该排序不是依据的传统的比较的思想,她是采用,先让所有元素按照个位的数字,放在二维数组中(二维数组中,第一维:个位、十位、百位...,第二位用于盛放数据:一个数据、两个数据...),然后以为数组记录每个个位数组里数据的数量,然后再将二维数组中的数据,依据从小到大的顺序拿出来,这个新组成的数据,就是第一轮排序后的结果。
以此类推,完成十位、百位的排序...
  • 代码:
package Sort;

import java.util.Arrays;

public class RadixSort {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] arr = {34,12,890,443,789,32,18,90};
		RadixSort radixSort = new RadixSort();
		radixSort.Radix(arr);
		System.out.println(Arrays.toString(arr));

	}
	
	
	//基数排序:用空间换时间
	//思路:
	//1、首先找到数组中元素位数最多的那一位,看看他有几位组成,就遍历几次
	//2、生成一个10*n的二维数组,大小和arr.length一样。在生成个一维数组,用于记录每个每个桶里有几个元素
	//3、开始遍历,先从各个元素的个位开始遍历,从小到大放在数组中,放入后,在依次取出来,这就完成了一次遍历
	//4、然后继续遍历,直到遍历完。
	
	public void Radix(int[] arr) {
		if(arr.length == 0) {
			return;
		}
		//定义一个二维数组,用于存放数组
		int[][] arr2 = new int[10][arr.length];
		//定义一个一维数组,用于计数
		int[] arr1 = new int[10];
		
		
		int max = 0;//最大元素
		for(int i = 0; i < arr.length; i++) {
			if(max < arr[i]) {
				max = arr[i];
			}
		}
		//看最大元素有几位数组成
		max = (max +"").length();//比如345,那么max = 3
		int temp;
		int index;
		
		//遍历max次,
		for(int i = 0 ,n = 1; i < max; i++ , n *= 10) {
			//n:用于取个位、十位、百位...放入arr2中
			for(int j = 0; j < arr.length; j++) { 
				temp = arr[j] / n % 10;
				arr2[temp][arr1[temp]++] = arr[j];			
			}
			index = 0;
			//将arr2元素取出来,重新合在一起
		
			for(int k = 0; k < 10; k++) {
				if(arr1[k] != 0) {
					for(int m = 0;m < arr1[k]; m++) {
						arr[index++] = arr2[k][m];
					}
				}	
				arr1[k] = 0;
			}
			
		}		
	}
	

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值