java基数排序算法代码下载

9 篇文章 0 订阅

原文:java基数排序算法代码下载 代码下载地址:http://www.zuidaima.com/share/1550463272684544.htm

基数排序:基数排序可以说是扩展了的桶式排序, * 比如当待排序列在一个很大的范围内,比如0到999999内,那么用桶式排序是很浪费空间的。 * 而基数排序把每个排序码拆成由d个排序码,比如任何一个6位数(不满六位前面补0)拆成6个排序码, * 分别是个位的,十位的,百位的。。。。 * 排序时,分6次完成,每次按第i个排序码来排。 * 一般有两种方式: * 1) 高位优先(MSD): 从高位到低位依次对序列排序 * 2) 低位优先(LSD): 从低位到高位依次对序列排序 * 计算机一般采用低位优先法(人类一般使用高位优先),但是采用低位优先时要确保排序算法的稳定性。 * 基数排序借助桶式排序,每次按第N位排序时,采用桶式排序。 * 对于如何安排每次落入同一个桶中的数据有两种安排方法: * 1)顺序存储:每次使用桶式排序,放入r个桶中,相同时增加计数。 * 2)链式存储:每个桶通过一个静态队列来跟踪。

 

package com.zuidaima.javasort.radixsorter;  
  
import java.util.Arrays; 
/**
*@author www.zuidaima.com
**/
  
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]+",");  
        }  
  
  
    }  

 标签: 算法 排序 基数 java话题: 语言基础

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值