数据结构算法之排序系列Java、C源码实现(8)--基数排序

基数排序   

这是一种和前述算法完全不同的排序方法。前述算法都要进行关键字的比较,而基数排序不需要进行记录关键字之间的比较。

 链式基数排序  

思想:从低位到高位一次对待排序的关键码进行分配和收集,经过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; 
}  
 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值