算法导论学习笔记--基数排序的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]+" "); } } }