数据结构系列之基数排序

     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 



你可能感兴趣的:(数据结构)