算法导论学习笔记--基数排序的java实现(详细)

  最近,在看MIT那套久负盛名的算法导论的教程,已经追到了第五讲,线性排序,里面讲到了计数排序和基数排序,对于基数排序,当时学数据结构的时候只是知道原理,从来没有实现过,确切的说是不会实现,看完教程自己试着写了一下,参考了网上一些大神的代码,终于算是搞懂了,把几乎每一行代码都加上了注释,贴在这里:

package com.wang.practice1;

import java.util.Arrays;

import org.junit.Test;
//基数排序
public class RadixSort {

    @Test
    public void test1(){
         int a[]={492,38,65,97,76,13,277,495,78,34,12,645,5,466,62,99,98,54,566,1711,18,232,34,15,35,25,53,51};
         radixSort(a,10,4);
         print(a);
    }
    /**
     * 
     * @param a   待排序数组
     * @param radix    基数,一般都是10  
     * @param d  待排序元素中最大数的位数
     */
    private void radixSort(int[] a,int radix,int d) {
        //用来暂时存放要排序的数组元素
        int temp[] =new int[a.length];
        //用来基数排序的数组,里边存储着每个元素应当出现的下标位置
        int count[]=new int[radix];
        //用来求每一位(个,十,百,千)位的数字大小的辅助变量,每执行完一次循环后,divide*10
        int divide=1;
        //数组a的长度,因为会多次用到,这里把它定义出来
        int len=a.length;
        
        //一共进行radix次循环,每次循环通过对某一位(个->十->百....)的排序,完成一次对数组a的打乱排序,
        //当该for循环执行完毕后,数组a就是有序的了
        for(int i=0;i<d;i++){
            
            //将待排序数组a全部复制到数组temp中
            System.arraycopy(a, 0, temp, 0, len);
            //对于数组count初始化每个元素的值,为0.
            Arrays.fill(count, 0);
            for(int j=0;j<len;j++){
                //获取每个元素当前那一位的数值
                int tempIndex=(temp[j]/divide)%radix;
                //在count数组中将该索引位置的元素+1,表示这个位上的值出现的次数
                count[tempIndex]++;
                
            }
            
            for(int j=1;j<radix;j++){
                //count数组每个下标位置上的值表示为所有在该下标前面的所有值的和,
                //进行这一步操作主要是为了接下来,为每个数组a的值分配下标位置
                count[j]=count[j]+count[j-1];
            }
            
            
            for(int j=len-1;j>=0;j--){
                //获取当前个元素在当前那一位的数值
                int tempIndex=(temp[j]/divide)%radix;
                //把temp数组当前位置的元素放回到a数组的指定索引位置,就相当于用掉了一个位置,所以减一
                count[tempIndex]--;
                //把temp数组当前位置的元素放回到a数组的指定索引位置
                a[count[tempIndex]]=temp[j];
                
                
            }
            
            //得到下一个数位
            divide*=radix;
        }
        
    }

    void print(int[] a ){
        for(int i=0;i<a.length;i++){
            System.out.print(a[i]+" ");
        }
        
    }
}

 

posted @ 2016-04-29 20:11  冬至饮雪  阅读(295)  评论(0编辑  收藏  举报