基数排序

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
struct Node
{
    int key;
    Node *next;

    Node(int k)
    {
        key = k;
        next = NULL;
    }
};

void Insert(Node **phead,int k)
{
    if(*phead == NULL)
    {
        *phead = new Node(k);
    }
    else
    {
        Node *p = *phead;
        while(p->next!=NULL)
        {
            p = p->next;
        }
        p->next = new Node(k);
    }
}

void Clear(Node **phead)
{
    if(*phead == NULL)
    {
        return;
    }
    else
    {
        Node *p = *phead;
        Node *q;
        while(p->next!=NULL)
        {
            q=p->next;
            delete p;
            p=q;
        }
        delete p;
        p = NULL;
        q = NULL;
        *phead = NULL;
    }
}

int maxValue(int *A,int len)
{
    if(A==NULL)
    {
        printf("A==NULL
");
        exit(0);
    }
    int max=A[0];
    for(int i=0;i<len;i++)
    {
        if(A[i]>max)
        {
            max = A[i];
        }
    }
    return max;
}

int maxColum(int num)
{
    for(int i=1;i<11;i++)
    {
        if(num/(int)pow(10.0,i) == 0)
        {
            return i;
        }
    }
}

void RadixSort(int *A,int len)
{
    int max = maxValue(A,len);
    int colum = maxColum(max);
    Node **B = new Node*[10];
    for(int i=0;i<10;i++)
    {
        *(B+i) = NULL;
    }

    for(int j=0;j<colum;j++)
    {
        int index=0;
        for(int i=0;i<len;i++)
        {
            index = (A[i]/(int)pow(10.0,j))%10;
            Insert(&B[index],A[i]);
        }
        int k=0;
        for(int i=0;i<10;i++)
        {
            Node *p = B[i];
            while(p!=NULL)
            {
                A[k]=p->key;
                ++k;
                p=p->next;
            }
        }
        for(int i=0;i<10;i++)
        {
            Clear(&B[i]);
        }
    }
}

int main()
{
    int A[]={31,52,42,12,65,325,24,13};
    int len = sizeof(A)/sizeof(int);
    RadixSort(A,len);
    for(int i=0;i<len;i++)
    {
        printf("%d ",A[i]);
    }
    printf("
");
    return 0;
}
原文地址:https://www.cnblogs.com/johnsblog/p/3938155.html