八大排序之基数排序(桶排序)

基数排序基本思想是:比较各个位上的 数值先比较个位在比较十位、百位、、。适用于数据量大 差值也较大的情况 适用 时间复杂度O(kn)

12,444,999,1,4,99,89,98,100,210,211进行排序

1、借助一个叫做桶的工具

先进行个位数排序 然后拿出 从左到右、从上到下的顺序拿出

//定义桶
int bucket[][]=new int[10][arr.length];
//定义每一个桶里面存放多少数据的数组
int count[]=new int[10];
//把数组a放入桶里面
for(int i=0;i<arr.length;i++) {
//进行个位十位百位数比较的时候arr[i]/1%10、arr[i]/10%10、arr[i]/100%10 
int element= arr[i] / 1 % 10;
bucket[element][count[element]]=arr[i];
count[element]++;
}

 排完序后从左到右、从上到下的顺序拿出

//记录数组a的下标
 int index=0;
    //遍历count数组 如果count[k]>0那么对应的第几个桶就有数据全部拿出来之后把count[k]置0;
for(int k=0;k<count.length;k++) {
if(count[k]!=0) {
for(int i=0;i<count[k];i++,index++) {
arr[index]=bucket[k][i];
   }
						
  }
count[k]=0;
}

全部代码相比单个放入取出多了一步确定要拿出几步的过程

int max=arr[0];
			for(int i=0;i<arr.length;i++) {
				if(arr[i]>max) {
					max=arr[i];
				}
			}
			int maxLength=(max+"").length();
			int bucket[][]=new int[10][arr.length];
			int count[]=new int[10];
			int n=1;
			for(int j=0;j<maxLength;j++,n=n*10) {

完整代码:

public class ReadixSort {//基数排序 运用桶
	public static void main(String[] args) {
		int arr[]= {1,123,332,223,122,55,44,43,22,5,6,2,66,67};
		put(arr);
 }
  
public static void put(int arr[]) {
			int max=arr[0];
			for(int i=0;i<arr.length;i++) {
				if(arr[i]>max) {
					max=arr[i];
				}
			}
			int maxLength=(max+"").length();
			int bucket[][]=new int[10][arr.length];
			int count[]=new int[10];
			int n=1;
			for(int j=0;j<maxLength;j++,n=n*10) {
				for(int i=0;i<arr.length;i++) {
					int element= arr[i] / n % 10;
					 bucket[element][count[element]]=arr[i];
					 count[element]++;
					}
				int index=0;
				for(int k=0;k<count.length;k++) {
					if(count[k]!=0) {
						for(int i=0;i<count[k];i++,index++) {
							arr[index]=bucket[k][i];
						}
						
						}
					count[k]=0;
					}
				}
			System.out.println(Arrays.toString(arr));
			
		}
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值