基数排序:将待排序数从低位到高位分别排序,从而最后有序
一个很形象的动画演示:http://www.cs.usfca.edu/~galles/visualization/RadixSort.html
我的代码及注释:
package com.sort; public class RadixSort { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub int[] a = {22,64,35,35,35,68,30,88,22,27,41,24}; radixSort(a, 2); System.out.println("the result"); for(int i = 0 ; i < a.length ; i++ ){ System.out.print(a[i] + " "); } } //第一步先来排序固定位的数字, public static void radixSort(int[] a, int n){ int len = a.length; int[] temp = new int[len]; int[] count = new int[10]; for(int j = 1; j<= n; j++){ //对count数组进行初始化,清空每一次排序的数据 for(int i = 0; i < 10; i++ ){ count[i] = 0; } //取相应第j位上的数 for(int i = 0; i < len; i++){ count[(((10*a[i])/(int)(Math.pow(10, j)))%10)]++; } //输出第各个位的数看看 for(int i=0;i<10;i++){ System.out.print(count[i]+" "); } System.out.println(); //得到各个位上的绝对位置,也就是第j趟排序的最终位置 for(int i = 1; i< 10;i++){ count[i] += count[i-1]; } //输出来看看 for(int i=0;i<10;i++){ System.out.print(count[i]+" "); } System.out.println(); //收集数据,从原数组收集数据放到相应绝对位置上,从而排序,采用从高位到低位循环,并且每一次都把绝对位置减一 for(int i = len-1;i>=0;i--){ temp[--count[(((10*a[i])/(int)(Math.pow(10, j)))%10)]] = a[i]; } //将temp数组的数付给原数组 for(int i = 0;i< len ;i++){ a[i] = temp[i]; } //第i次排序之后 System.out.println("the "+j); for(int i = 0 ; i < a.length ; i++ ){ System.out.print(a[i] + " "); } System.out.println("\n"); } } }
最后输出的结果:
1 1 2 0 2 3 0 1 2 0 1 2 4 4 6 9 9 10 12 12 the 1 30 41 22 22 64 24 35 35 35 27 68 88 0 0 4 4 1 0 2 0 1 0 0 0 4 8 9 9 11 11 12 12 the 2 22 22 24 27 30 35 35 35 41 64 68 88 the result 22 22 24 27 30 35 35 35 41 64 68 88