基数排序(c)

基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。

解法:
比如有一串数字:32 41 55 12 62 63 21 89 24 74
首先根据个位数的数值,在走访数值时将它们分配至编号0到9的桶子中:
桶编号0到9:
0
1 41 21
2 32 12 62
3 63
4 24 74
5 55
6
7
8
9 89

然后:接下来将这些桶子中的数值重新串接起来,成为以下的数列:
41 21 32 12 62 63 24 74 55 89

最后:按照十位数进行分配
0
1 12
2 21 24
3 32
4 41
5 55
6 62
7 74
8 89
把数字串接后:
12 21 24 32 41 55 62 74 89排序完成

c代码

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

int get_max_inarr(int *,int);  //获取一个数组中的最大数
int get_max_bit(int); //或者一个人数的位数
void sort(int *,int ); //基数排序
int main()
{
    int arr[] = { 81, 22, 73, 93, 43, 14, 55, 65, 28, 39 };
    int size = sizeof(arr) / sizeof(int);
    //int num=get_max_inarr(arr, 10);
    //printf("%d", get_max_bit(num));
    sort(arr,10);
    for (int i = 0; i < size; i++)
        printf("%d ", arr[i]);
    system("pause");
    return 0;
}
void sort(int *arr, int n)
{
    int data[10];
    int table[10][10] = {};
    int i, j;
    int max_arr = get_max_inarr(arr,n);
    int max_bit = get_max_bit(max_arr);
    for (i = 0; i <= max_bit; i++)  //个,十,百...排序
    {
        for (int a = 0; a < n;a++) // 遍历数组
        { 
            //634 (634/1)%10 个位4
            //(634/10)%10 十位3
            //(634/100)%10 百位6
            int temp = (*(arr + a) / int(pow(10, i))) % 10;
            for (j = 0; j < 10; j++)  
            {
                if (table[temp][j] == NULL)
                {
                    table[temp][j] = *(arr + a);//放入桶中 
                    break;
                }
            }
        }
        int k = 0;
        for (int m = 0; m < n; m++)
        {
            for (int l = 0; l < 10; l++)
            {
                if (table[m][l] != NULL)
                {
                    arr[k++] = table[m][l]; //将桶中数进行串接
                    table[m][l] = NULL; //清空,进行下个高位数的分配
                }
            }
        }
    }
}

int get_max_inarr(int *arr,int n)
{
    int max = 0;
    for(int i=1; i < n; i++)
    {
        if (arr[max] < arr[i])
        {
            int temp = arr[max];
            arr[max] = arr[i];
            arr[i] = temp;
        }
    }
    return arr[max];
}

int get_max_bit(int num)
{
    int count = 0;
    int tmep = num / 10;
    while (tmep != 0)
    {
        count++;
        tmep = tmep / 10;
    }
    return count;
}
点赞