数据结构系列之基数排序

     1、基数排序原理

      基数排序的总体思路就是将待排序数据拆分成多个关键字进行排序,也就是说,基数排序的实质是多关键字排序。

基数排序的思想就是将待排数据中的每组关键字依次进行桶分配比如下面的待排序列:

278、109、063、930、589、184、505、269、008、083

我们将每个数值的个位,十位,百位分成三个关键字: 278 -> k1(个位)=8 ,k2(十位)=7 ,k3=(百位)=2。

然后从最低位个位开始(从最次关键字开始),对所有数据的k1关键字进行桶分配(因为,每个数字都是 0-9的,因此桶大小为               10),再依次输出桶中的数据得到下面的序列。

930、063、083、184、505、278、008、109、589、269

再对上面的序列接着进行针对k2的桶分配,输出序列为:

505、008、109、930、063、269、278、083、184、589

最后针对k3的桶分配,输出序列为:

008、063、083、109、184、269、278、505、589、930


2、基数排序实现

	 public void radixSort(int[] data, int radix, int d) {  
	        // 缓存数组  
	        int[] tmp = new int[data.length];  
	        // buckets用于记录待排序元素的下标信息  
	        // radix表示桶的个数,一般取10,d表示待排序数组中最大数字的位数
	        int[] buckets = new int[radix];  
	        for (int i = 0, rate = 1; i < d; i++) {  
	            // 重置count数组,开始统计下一个关键字  
	            Arrays.fill(buckets, 0);  
	            // 将data中的元素完全复制到tmp数组中  
	            System.arraycopy(data, 0, tmp, 0, data.length);  
	            // 计算每个待排序数据的子关键字  
	            for (int j = 0; j < data.length; j++) {  
	                int subKey = (tmp[j] / rate) % radix;  
	                buckets[subKey]++;  
	            }  
	           //该循环重新分布数组的下标信息
	            for (int j = 1; j < radix; j++) {  
	                buckets[j] = buckets[j] + buckets[j - 1];  
	            }  
	  
	            // 按子关键字对指定的数据进行排序  
	            for (int m = data.length - 1; m >= 0; m--) {  
	                int subKey = (tmp[m] / rate) % radix;  
	                data[--buckets[subKey]] = tmp[m];  
	            }  
	            rate *= radix;  
	        }  
	  }  

        3、测试及结果

 

public static void main(String[] args) {
		
	int a[]={3,6,0,6,12,21,10,12,45,23,617};
	Sort s=new Sort();
        s.radixSort(a, 10, 3);
        s.P(a);
	}
       结果为:

数组为:0 3 6 6 10 12 12 21 23 45 617 



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值