基数排序

来源:互联网 发布:xampp mysql mac设置 编辑:程序博客网 时间:2024/06/03 14:43

8646 基数排序

时间限制:1000MS  内存限制:1000K
提交次数:1581 通过次数:1071

题型: 编程题   语言: G++;GCC

Description

用函数实现基数排序,并输出每次分配收集后排序的结果



输入格式

第一行:键盘输入待排序关键的个数n第二行:输入n个待排序关键字,用空格分隔数据


输出格式

每行输出每趟每次分配收集后排序的结果,数据之间用一个空格分隔


输入样例

10278 109 063 930 589 184 505 069 008 083


输出样例

930 063 083 184 505 278 008 109 589 069 505 008 109 930 063 069 278 083 184 589 008 063 069 083 109 184 278 505 589 930 
#include <iostream>#define radix 10//该数据的进制,因此可能出现的为0,1,2,3,4,5,6,7,8,9#define BIT 11//该数据最大的存储位数using namespace std;typedef struct{        int key[BIT];        int next;} number;void Dictribute(number r[],int f[],int e[],int k){        for (int i = 0; i < radix; i++) f[i] = 0;        for (int i = r[0].next; i != 0; i=r[i].next) //遍历链表,r[N]是有数据的,但是r[N].next=0;        {                int j = r[i].key[k];                if (f[j] == 0)                        f[j] = i;                else r[e[j]].next = i;                e[j] = i;        }}void Collect(number r[],int f[],int e[]){        int t = 0;        for (int j = 0; j < radix; j++)        {                if (f[j] != 0) //把不为空的桶子串接起来                {                        r[t].next = f[j];                        t = e[j];                }        }        r[t].next = 0; //把最后的表尾指向表头}void Print(number r[],int max_bit){        for (int i = r[0].next; i != 0; i = r[i].next)        {                for (int j = max_bit-1; j >=0; j--)                        printf("%d", r[i].key[j]);                printf(" ");        }        printf("\n");}void RadixSort(number r[],int f[],int e[],int N,int max_bit){        for (int i = 0; i < N; i++) r[i].next = i + 1; //循环链表        r[N].next = 0;        for (int i = 0; i < max_bit; i++) //因为实际存储位数的为max_bit-1,包括了0        {                Dictribute(r,f,e,i);                Collect(r,f,e);                Print(r,max_bit);        }}int main(){        number r[100];        int f[radix];//f[j]中存放的是该桶子第一个结点的地址,游标是地址        int e[radix];//e[j]中存放的是该桶子最后一个结点的地址        int N;        int max_bit;        int t,j;        scanf("%d", &N);        max_bit = 0;        for (int i = 1; i <= N; i++)        {                for (j = 0; j < BIT; j++) r[i].key[j] = 0;//将容器清0                scanf("%d", &t);                for (j = 0; t && j < BIT; t = t / 10, j++)                        r[i].key[j] = t % 10;//拆数字                if (j > max_bit)//筛选最大位数                        max_bit = j;        }        RadixSort(r,f,e,N,max_bit);        return 0;}/*10278 109 063 930 589 184 505 069 008 083*//*930 063 083 184 505 278 008 109 589 069505 008 109 930 063 069 278 083 184 589008 063 069 083 109 184 278 505 589 930*//*代码其实很多情况下都是先进行大量的原型实现,然后再加以调整,加以迭代,这样写出来的代码就会比较高深复杂.因此,很多情况下,我们都必须先抓住代码实现的原型,再在代码上捕捉代码实现精彩的地方*/