这是一种和前述算法完全不同的排序方法。前述算法都要进行关键字的比较,而基数排序不需要进行记录关键字之间的比较。
思想:从低位到高位一次对待排序的关键码进行分配和收集,经过d趟分配和收集,就可以得到一个有序序列。
1.若关键字是十进制整数,则按个、十、百等位进行分解,基数rd=10,C0=0,C9=9,d为最长整数的位数。
2.若关键字是小写的英文字,则rd=26,C0=‘a’,C25=‘z’,d为字符串的最大长度。
java代码:
public class RadixSort { public static void main(String[] args) { int array[] ={3,22,93,3,5,14,28,65,39,81,71,72,48,39,55,105,129,184,196,208}; showArray(array); System.out.println("\n排序后"); radixSort(array,array.length); showArray(array); } private static void radixSort(int[] a,int size) { int[][] temp=new int[10][20]; //第一个10表示0~9,第二个20表示a的size int[] order=new int[10]; int i,j,k; //k表示当前比较的那一位上的具体数字 int n; //n=1,10,100,1000...取决于a中的最大的数 int p; n=1; while(n <= 100) { for(i=0;i<size;i++) { k = (a[i]/n) % 10; temp[k][order[k]] = a[i]; order[k]++; } p=0; //p为一次排序过程中,a的脚标 for(i=0;i<10;i++) { if(order[i] != 0) { for(j=0;j<order[i];j++) { a[p] = temp[i][j]; p++; } order[i] = 0; } } n *= 10; } } private static void showArray(int[] a) { for (int i = 0; i < a.length; i++) { System.out.print(a[i] + " "); } } }
c代码:
//基数排序
#include<stdio.h> void radixSort(int *a,int size) { int temp[10][20]={0}; //第一个10表示0~9,第二个20表示a的size int order[10]={0}; int i,j,k; //k表示当前比较的那一位上的具体数字 int n; //n=1,10,100,1000...取决于a中的最大的数 int p; n=1; while(n <= 100) { for(i=0;i<size;i++) { k = (a[i]/n) % 10; temp[k][order[k]] = a[i]; order[k]++; } p=0; //p为一次排序过程中,a的脚标 for(i=0;i<10;i++) { if(order[i] != 0) { for(j=0;j<order[i];j++) { a[p] = temp[i][j]; p++; } order[i] = 0; } } n *= 10; } } int main() { int a[20]={3,22,93,3,5,14,28,65,39,81,71,72,48,39,55,105,129,184,196,208}; int i; radixSort(a,20); for(i=0;i<20;i++) printf("%d ",a[i]); return 0; }