基数排序

基数排序类似于桶排序

基数排序首先找到最大值,确定入桶次数,如果最大值是百位的就入桶出桶三次,以此类推

由于为了方便,我们创建10个桶,因为每一位最多就10种数(0-9)

首先先以个位数字入桶,然后将桶中的元素出桶重新装到原数组里

循环操作,最后原数组中得到的数据就是有序的

在我理解基数排序,首先排完个位之后,再排十位,那么十位相同但是个位低的会先入桶

也就是说十位数变成了有序的了,排完十位再排百位,那么百位数相同但是十位数低的会先入桶,

所以也就实现了排序

 

typedef struct NODE
{
    int nValue;
    struct NODE* pNext;
}Node;
int GetTenMi(int count)
{
    int temp = 1;
    while(count != 0)
    {
        temp *= 10;
        count--;
    }
    return temp;
}

void RadixSort(int* arr,int length)
{
    if(arr == NULL || length <= 0) return;
    
    int min;
    int max;
     //得到最大值 
    if(length/2*2 != length)
    {
        max = arr[0];
        min = arr[0];
        int a;
        int b;
        for(int i=1;i<length;i+=2)
        {
            a = arr[i]>arr[i+1]?arr[i]:arr[i+1];
            b = arr[i]<arr[i+1]?arr[i]:arr[i+1];
            max = max>a?max:a;
            min = min<b?min:b;
        }
    }
    else
    {
        max = arr[0]>arr[1]?arr[0]:arr[1];
        min = arr[0]<arr[1]?arr[0]:arr[1];
        int a;
        int b;
        for(int i=2;i<length;i+=2)
        {
            a = arr[i]>arr[i+1]?arr[i]:arr[i+1];
            b = arr[i]<arr[i+1]?arr[i]:arr[i+1];
            max = max>a?max:a;
            min = min<b?min:b;
        }
    }
    int count = 0;
    int temp = max;
    while(temp != 0)
    {
        temp /=10;
        count++;
    }
    //创建桶 
    Node** ptemp = (Node**)malloc(sizeof(Node*)*10);
    memset(ptemp,0,sizeof(Node*)*10);
    for(int i=0;i<count;i++)
    {
        //往桶里添加 
        for(int j=0;j<length;j++)
        {
            Node* p = (Node*)malloc(sizeof(Node));
            p->nValue = arr[j];
            p->pNext = NULL;

            int index = arr[j]/GetTenMi(i)%10;
            Node* bj = ptemp[index];
            if(bj == NULL)
            {
                ptemp[index] = p;    
                continue;
            }
            while(bj->pNext)
            {    
                bj = bj->pNext;
            }
            bj->pNext = p;
        }
        //装回原数组 
        int aa = 0;
        for(int j=0;j<10;j++)
        {
            Node* bj = ptemp[j];
            while(bj)
            {
                arr[aa] = bj->nValue;
                aa++;
                bj = bj->pNext;
            }
        }
        //删除 
        for(int j=0;j<10;j++)
        {
            if(ptemp[j])
            {
                Node* pDel = ptemp[j];
                ptemp[j] = ptemp[j]->pNext;
                free(pDel);
                pDel = NULL;
            }
        }
        memset(ptemp,0,sizeof(Node*)*10);
        
    }

}
原文地址:https://www.cnblogs.com/TheQi/p/9141833.html