package com.javasort.radixsorter;  
  
import java.util.Arrays;  
  
public class RadixSorter {  
public static boolean USE_LINK=true;  
      
    public void sort(int[] keys,int from ,int len,int radix, int d)  
    {  
        if(USE_LINK)  
        {  
            link_radix_sort(keys,from,len,radix,d);  
        }  
        else  
        {  
            array_radix_sort(keys,from,len,radix,d);  
        }  
          
    }  
      
      
    private final void array_radix_sort(int[] keys, int from, int len, int radix,  
            int d)   
    {  
        int[] temporary=new int[len];  
        int[] count=new int[radix];  
        int R=1;  
          
        for(int i=0;i<d;i++)  
        {  
            System.arraycopy(keys, from, temporary, 0, len);  
            Arrays.fill(count, 0);  
            for(int k=0;k<len;k++)  
            {  
                int subkey=(temporary[k]/R)%radix;  
                count[subkey]++;  
            }  
            for(int j=1;j<radix;j++)  
            {  
                count[j]=count[j]+count[j-1];  
            }  
            for(int m=len-1;m>=0;m--)  
            {  
                int subkey=(temporary[m]/R)%radix;  
                --count[subkey];  
                keys[from+count[subkey]]=temporary[m];  
            }  
            R*=radix;  
        }  
             
    }  
  
  
    private static class LinkQueue  
    {  
        int head=-1;  
        int tail=-1;  
    }  
    private final void link_radix_sort(int[] keys, int from, int len, int radix, int d) {  
          
        int[] nexts=new int[len];  
          
        LinkQueue[] queues=new LinkQueue[radix];  
        for(int i=0;i<radix;i++)  
        {  
            queues[i]=new LinkQueue();  
        }  
        for(int i=0;i<len-1;i++)  
        {  
            nexts[i]=i+1;  
        }  
        nexts[len-1]=-1;  
          
        int first=0;  
        for(int i=0;i<d;i++)  
        {  
            link_radix_sort_distribute(keys,from,len,radix,i,nexts,queues,first);  
            first=link_radix_sort_collect(keys,from,len,radix,i,nexts,queues);  
        }  
        int[] tmps=new int[len];  
        int k=0;  
        while(first!=-1)  
        {  
          
            tmps[k++]=keys[from+first];  
            first=nexts[first];  
        }  
        System.arraycopy(tmps, 0, keys, from, len);  
          
          
    }  
    private final void link_radix_sort_distribute(int[] keys, int from, int len,  
            int radix, int d, int[] nexts, LinkQueue[] queues,int first) {  
          
        for(int i=0;i<radix;i++)queues[i].head=queues[i].tail=-1;  
        while(first!=-1)  
        {  
            int val=keys[from+first];  
            for(int j=0;j<d;j++)val/=radix;  
            val=val%radix;  
            if(queues[val].head==-1)  
            {  
                queues[val].head=first;  
            }  
            else   
            {  
                nexts[queues[val].tail]=first;  
                  
            }  
            queues[val].tail=first;  
            first=nexts[first];  
        }  
          
    }  
    private int link_radix_sort_collect(int[] keys, int from, int len,  
            int radix, int d, int[] nexts, LinkQueue[] queues) {  
        int first=0;  
        int last=0;  
        int fromQueue=0;  
        for(;(fromQueue<radix-1)&&(queues[fromQueue].head==-1);fromQueue++);  
        first=queues[fromQueue].head;  
        last=queues[fromQueue].tail;  
          
        while(fromQueue<radix-1&&queues[fromQueue].head!=-1)  
        {  
            fromQueue+=1;  
            for(;(fromQueue<radix-1)&&(queues[fromQueue].head==-1);fromQueue++);  
              
            nexts[last]=queues[fromQueue].head;  
            last=queues[fromQueue].tail;  
              
        }  
        if(last!=-1)nexts[last]=-1;  
        return first;  
    }  
      
    public static void main(String[] args) {  
        int[] a={1,4,8,3,2,9,5,0,7,6,9,10,9,135,14,15,11,33,999999999,222222222,1111111111,12,17,45,16};  
        USE_LINK=true;  
        RadixSorter sorter=new RadixSorter();  
        sorter.sort(a,0,a.length,10,10);  
        for(int i=0;i<a.length;i++)  
        {  
            System.out.print(a[i]+",");  
        }  
  
  
    }  
最近下载更多
mengnan8989  LV22 2018年5月16日
zzu蓝冰  LV1 2016年4月5日
holysir  LV28 2013年12月30日
最近浏览更多
BestClever  LV32 2022年4月27日
来水代码  LV1 2020年7月3日
0312wangchen  LV26 2020年5月26日
夏洛特VS夏洛克  LV6 2019年8月26日
郑俊杰 2019年7月10日
暂无贡献等级
172823040 2018年12月19日
暂无贡献等级
恋伊love  LV9 2018年11月29日
carrot_hu  LV1 2018年6月4日
mengnan8989  LV22 2018年5月16日
pengccc  LV7 2018年1月29日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友