`
128kj
  • 浏览: 583669 次
  • 来自: ...
社区版块
存档分类
最新评论

基数排序

阅读更多
    基数排序可以说是扩展了的桶式排序,比如当待排序列在一个很大的范围内,比如0到999999内,那么用桶式排序是很浪费空间的。而基数排序把每个排序码拆成由d个排序码,比如任何一个6位数(不满六位前面补0)拆成6个排序码,分别是个位的,十位的,百位的。。。。
排序时,分6次完成,每次按第i个排序码来排。

下面举一个例子:

   如果要对6个3位整数进行排序,你会怎么做?我猜想大多数人会这样做:
123  123  123 

343  135  135

362  241  241

241  343  343

135  362  352

352  352  362

先对高位进行排序,然后对高位相同的,次高位进行排序,一直进行到低位。

基数排序进行排序的方向一般有两种方式:
1) 高位优先(MSD): 从高位到低位依次对序列排序
2)低位优先(LSD): 从低位到高位依次对序列排序
计算机一般采用低位优先法(人类一般使用高位优先),

低位优先可以按照下面的一组数字做出说明:12、 104、 13、 7、 9

    (1)按个位数排序是12、13、104、7、9

    (2)再根据十位排序104、7、9、12、13

    (3)再根据百位排序7、9、12、13、104

    这里注意,如果在某一位的数字相同,那么排序结果要根据上一轮的数组确定,举个例子来说:07和09在十分位都是0,但是上一轮排序的时候09是排在07后面的;同样举一个例子,12和13在十分位都是1,但是由于上一轮12是排在13前面,所以在十分位排序的时候,12也要排在13前面。

    所以,一般来说,10基数排序的算法应该是这样的?

    (1)判断数据在各位的大小,排列数据;

    (2)根据1的结果,判断数据在十位的大小,排列数据。如果数据在这个位置的余数相同,那么数据之间的顺序根据上一轮的排列顺序确定;

    (3)依次类推,继续判断数据在百位、千位......上面的数据重新排序,直到所有的数据在某一位上数据都为0。

   基数排序一般借助桶式排序,每次按第N位排序时,采用桶式排序。对于如何安排每次落入同一个桶中的数据有两种安排方法:
1)顺序存储:每次使用桶式排序,放入r个桶中,相同时增加计数。
2)链式存储:每个桶通过一个静态队列来跟踪。

import java.util.Arrays;  
  
public class RadixSort{  
  
    //基于桶排序的基数排序算法   
    private static void radixSort(int[] array,int radix, int distance) {  
        //array为待排序数组   
        //radix,代表基数 (桶的个数)  
        //代表排序元素的位数   
          
        int length = array.length;  
        int[] temp = new int[length];//用于暂存元素   
        int[] count = new int[radix];//用于桶排序   
        int divide = 1;  
          
        for (int i = 0; i < distance; i++) {  
              
            System.arraycopy(array, 0,temp, 0, length);  
            Arrays.fill(count, 0);  
              
            for (int j = 0; j < length; j++) {  
                int tempKey = (temp[j]/divide)%radix;  
                count[tempKey]++;  
            }  
              
            for (int j = 1; j < radix; j++) {  
                count [j] = count[j] + count[j-1];  
            }  
              
            //重点在下面这个方法               
            for (int j = length - 1; j >= 0; j--) {  
                int tempKey = (temp[j]/divide)%radix;  
                count[tempKey]--;  
                array[count[tempKey]] = temp[j];  
            }  
              
            divide = divide * radix;                  
              
        }  
                  
    }  
  
    public static void main(String[] args) {  
      
        int[] array = {3,2,3,2,5,333,45566,2345678,78,990,12,432,56};  
        radixSort(array,10,7);  
        for (int i = 0; i < array.length; i++) {  
            System.out.print("  " + array[i]);  
        }  
          
  
    }  
  
}  

源码下载:
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics