排序之基数排序

基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。这种排序算法的主要优点是在处理大量数据时,其时间复杂度为O(nlogn),空间复杂度为O(1)。

代码实现

下面是基数排序的Java实现:

import java.util.Arrays;
//基数排序
public class RadixSort {

	public static void main(String[] args) {
		int[] arr = {57,71,41,208,10,39,1,6,15,106,109,107,20,30,50};
		sort(arr);
		System.out.println(Arrays.toString(arr));
	}
	public static void sort(int[] arr) {
		//定义桶
		int [][] bucket = new int[10][arr.length];
		//定义桶记录
		int[] elementCounts = new int[10];
		//获取最大值的位数
		int max = arr[0];
		for(int m = 0;m<arr.length;m++) {
			if(arr[m]>max) {
				max = arr[m];
			}
		}
		int maxLength = (max+"").length();
		int n = 1;
		for(int h=0;h<maxLength;h++) {
			//数据放入
			for(int i=0;i<arr.length;i++) {
				int element = arr[i]/n%10;//element代表个位数值,也代表要放入哪号桶
				int count = elementCounts[element];//读取桶记录当中的数据
				bucket[element][count] = arr[i];//数据存入
				elementCounts[element]++;//桶记录+1
			}
			//数据取出
			int index = 0;//定义游标遍历数组,取出的数据要存放的下标
			//遍历桶记录
			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;
			//System.out.println(Arrays.deepToString(bucket));
		}
	}

}

工作原理

基数排序的基本思想是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。每次比较,都是将对应的数放入到对应的桶中,然后再从桶中取出。

首先,我们需要找到数组中的最大值,以确定最大位数。然后,我们按照每一位进行排序。对于每一位,我们都创建一个新的桶,并将元素放入相应的桶中。然后,我们从每个桶中取出元素,放回到原数组中。最后,我们继续处理下一位。

优点和缺点

优点:基数排序的时间复杂度为O(nlogn),空间复杂度为O(1),因此它非常适合处理大量数据。此外,基数排序是稳定的排序算法,即相等的元素的相对顺序不会改变。

缺点:基数排序需要额外的存储空间来存储桶,这可能会导致空间复杂度增加。此外,基数排序只适用于非负整数。

  • 16
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值