基数排序

使用10个辅助队列,假设最大数的数字位数为 x, 则一共做x次,从个位数开始往前,以第i位数字的大小为依据,将数据放进辅助队列,搞定之后回收。下次再以高一位开始的数字位为依据。

以Vector作辅助队列,基数排序的Java代码:


public class RadixSort {

     private int keyNum=-1;   

     private Vector<Vector<Double>> util;



     public void distribute(double [] sorted, int nth){       

         if(nth<=keyNum && nth>0){

              util=new Vector<Vector<Double>>();

              for(int j=0;j<10;j++){

                   Vector <Double> temp= new Vector <Double>();

                   util.add(temp);

              }            

              for(int j=0;j<sorted.length;j++){

                   int index= getNthDigit(sorted[j],nth);

                   util.get(index).add(sorted[j]);

              }

         }

     }   

     public int getNthDigit(double num,int nth){

         String nn= Integer.toString((int)num);

         int len= nn.length();

         if(len>=nth){

              return Character.getNumericValue(nn.charAt(len-nth)); 

         }else{

              return 0;

         }            

     }

     public void collect(double [] sorted){

         int k=0;

         for(int j=0;j<10;j++){

              int len= util.get(j).size();

              if(len>0){

                   for(int i=0;i<len;i++){

                       sorted[k++]= util.get(j).get(i);

                   }

              }

         }

         util=null;

     }

     public int getKeyNum(double [] sorted){    

         double max= Double.MIN_VALUE;

         for(int j=0;j<sorted.length;j++){

              if(sorted[j]>max){

                   max= sorted[j];

              }

         }       

         return Integer.toString((int)max).length();

     }

     public void radixSort(double [] sorted){

         if(keyNum==-1){            

              keyNum= getKeyNum(sorted);

         }

         for(int i=1;i<=keyNum;i++){

              distribute(sorted,i);

              collect(sorted);           

         }

     }

     public static void main(String[] args) {

         Random random = new Random(6);



         int arraysize = 21;

         double[] sorted = new double[arraysize];

         System.out.print("Before Sort:");

         for (int j = 0; j < arraysize; j++) {

              sorted[j] = (int) (random.nextDouble() * 100);

              System.out.print((int) sorted[j] + " ");

         }

         System.out.println();



         RadixSort sorter = new RadixSort();

         sorter.radixSort(sorted);

         System.out.print("After Sort:");

         for (int j = 0; j < sorted.length; j++) {

              System.out.print((int) sorted[j] + " ");

         }

         System.out.println();

     }

}
posted @   尐鱼儿  阅读(302)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示