基数排序

来源:互联网 发布:遗传算法bp神经网络 编辑:程序博客网 时间:2024/06/05 22:58

算法原理

基数排序(Radix Sort)用于数据长度相同的数据排序(若不相等,需要将数据补全),主要分为两类:最高位优先、最低位优先。

最高位优先(Most Significant Digit first)法,简称MSD法:先按K1排序分组,同一组中记录,关键码K1相等,再对各组按K2排序分成子组,之后,对后面的关键码继续这样的排序分组,直到按最次位关键码kd对各子组排序后。再将各组连接起来,便得到一个有序序列。

最低位优先(Least Significant Digit first)法,简称LSD法:先从Kd开始排序,再对Kd-1进行排序,依次重复,直到对k1排序后便得到一个有序序列。

显然LSD比较容易实现,只需不断递归调用基数排序即可,若要实现MSD,则递归函数将更加复杂。

Code

#include <iostream>   //这里以LSD为例#include <memory.h>#include <stdio.h>using namespace std;const int Max = 10000;int radix[10][Max]; //分配"桶"int input[Max];int leg(int a){    int ans  = 0;    while(a)    {        a/=10;        ans++;    }    return ans;}void radix_sort(int length,int max_length,int num){    if (length>max_length) return ;      //直到length超过数据最大长度    memset(radix,0,sizeof(radix));    int n = 1;    for (int i = 1;i<length;i++) n*=10;    for (int i = 0;i<num;i++)        {            int tmp =(input[i]/n)%10;            ++radix[tmp][0];             //radix[i][0]用于记录各"桶"中的数据个数            radix[tmp][radix[tmp][0]] = input[i];        }    int index = 0;    printf("%d:\n",length);    for (int i = 0;i<=9;i++)             //将各"桶"中数据以此存回到原数组中        for (int j = 1; j<=radix[i][0];j++)            input[index++] = radix[i][j];    radix_sort(length+1,max_length,num);}int main(){    int N,m = 0;    scanf("%d",&N);    for (int i = 0;i<N;i++)        {            scanf("%d",&input[i]);            m = (m<input[i])?input[i]:m; //记录最大数据        }    int length = leg(m);                 //求数据最大长度    radix_sort(1,length,N);              //递归调用基数排序    for (int i = 0;i<N;i++)        if (i==0) printf("%d",input[i]);            else printf(" %d",input[i]);    printf("\n");    return 0;}
原创粉丝点击