用C语言实现简单的基数排序

八大排序算法有:冒泡排序、插入排序、选择排序、快速排序、希尔排序、堆排序、归并排序、基数排序。前面七种网上都有很多例子,但是最后一种基数排序却很少看到,所以我总结了一下,并且自己写了一个简单的实现。

基数排序是一种分配排序,其基本思想是:排序过程无须比较关键字,而是通过“分配”和“收集”过程来实现排序。它们的时间复杂度可达到线性O(n)。基数排序所做的事情,是对N位分别进行排序。从直觉上来看,人们可能会觉得应该首先按最高有效位进行排序,不过这点与我们的直觉相反,基数排序首先对最低有效位数字进行排序。如果我们每次比较r bits,则需要进行b/r趟,每趟进行计数排序需要O(n+2^r),则总的时间复杂度为O(b/r(n+2^r))。

理论上来说,基数排序的速度是以上几种排序方法中最快的,可以达到O(N),而其它的排序算法最快也只有O(N*logN)。但是,基数排序需要占用额外的空间,而且只支持整数进行排序。

基数排序的演示可以看这里:基数排序

实现代码如下:
#include <stdio.h>
#include <string.h>
 
/* 获取输入数字的索引值,dec指定数字的位数,3代表百位数,order指定需要获取哪一位的索引,1代表个位,2代表十位,3代表百位 */
int get_index(int num, int dec, int order)
{
    int i, j, n;
    int index;
    int div;
 
    /* 根据位数,循环减去不需要的高位数字 */
    for (i=dec; i>order; i--) {
        n = 1;
        for (j=0; j<dec-1; j++)
            n *= 10;
        div = num/n;
        num -= div * n;
        dec--;
    }
 
    /* 获得对应位数的整数 */
    n = 1;
    for (i=0; i<order-1; i++)
        n *= 10;
 
    /* 获取index */
    index = num / n;
 
    return index;
}
 
/* 进行基数排序 */
void radix_sort(int array[], int len, int dec, int order)
{
    int i, j;
    int index;     /* 排序索引 */
    int tmp[len];  /* 临时数组,用来保存待排序的中间结果 */
    int num[10];   /* 保存索引值的数组 */
    memset(num, 0, 10*sizeof(int));  /* 数组初始清零 */
    memset(tmp, 0, len*sizeof(int)); /* 数组初始清零 */
 
    if (dec < order) /* 最高位排序完成后返回 */
        return;
 
    for (i=0; i<len; i++) {
        index = get_index(array[i], dec, order);  /* 获取索引值 */
        num[index]++;  /* 对应位加一 */
    }
 
    for (i=1; i<10; i++)
        num[i] += num[i-1]; /* 调整索引数组 */
 
    for (i=len-1; i>=0; i--) {
        index = get_index(array[i], dec, order);  /* 从数组尾开始依次获得各个数字的索引 */
        j = --num[index];  /* 根据索引计算该数字在按位排序之后在数组中的位置 */
        tmp[j] = array[i]; /* 数字放入临时数组 */
    }
 
    for (i=0; i<len; i++)
        array[i] = tmp[i];  /* 从临时数组复制到原数组 */
 
    printf("the %d time\n", order);
    for (i=0; i<30; i++)
        printf("%d  ", array[i]);
    printf("\n");
 
    /* 继续按高一位的数字大小进行排序 */
    radix_sort(array, len, dec, order+1);
 
    return;
}
 
int main(int argc, char *argv[])
{
    int i;
    int array[30] = {258, 976, 515, 337, 359, 701, 916, 494, 303, 175,
                        677, 825, 131, 560, 147, 254, 759, 814, 917, 382,
                        452, 114, 873, 585, 881, 127, 819, 658, 461, 435};
 
    int len = 30;  /* 测试数据个数 */
    int dec = 3;   /* 数据位数,3代表3位数 */
    int order = 1; /* 排序的位数,1代表个位、2代表十位、3代表百位 */
 
    printf("before\n");
    for (i=0; i<30; i++)
        printf("%d  ", array[i]);
    printf("\n");
 
    /* 排序函数,从个位开始 */
    radix_sort(array, len, dec, order);
 
    printf("final\n");
    for (i=0; i<30; i++)
        printf("%d  ", array[i]);
    printf("\n");
 
    return 0;
}
  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下为使用C语言实现基数计数排序的代码: ```c #include <stdio.h> #include <stdlib.h> // 求出数组中最大的数 int getMax(int arr[], int n) { int max = arr[0]; for (int i = 1; i < n; i++) { if (arr[i] > max) { max = arr[i]; } } return max; } // 基数计数排序 void radixCountingSort(int arr[], int n) { int max = getMax(arr, n); // 求出数组中最大的数 int exp = 1; // 初始位数为1 int *count = (int*)malloc(sizeof(int) * 10); // 计数数组 int *output = (int*)malloc(sizeof(int) * n); // 输出数组 while (max / exp > 0) { // 初始化计数数组 for (int i = 0; i < 10; i++) { count[i] = 0; } // 统计每个元素出现的次数 for (int i = 0; i < n; i++) { count[(arr[i] / exp) % 10]++; } // 计算每个元素在输出数组中的位置 for (int i = 1; i < 10; i++) { count[i] += count[i - 1]; } // 将元素按照计数数组中的位置,放入输出数组中 for (int i = n - 1; i >= 0; i--) { output[count[(arr[i] / exp) % 10] - 1] = arr[i]; count[(arr[i] / exp) % 10]--; } // 将输出数组中的元素复制到原数组中 for (int i = 0; i < n; i++) { arr[i] = output[i]; } // 位数增加 exp *= 10; } free(count); free(output); } // 输出数组中的元素 void printArray(int arr[], int n) { for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } printf("\n"); } int main() { int arr[] = { 170, 45, 75, 90, 802, 24, 2, 66 }; int n = sizeof(arr) / sizeof(arr[0]); printf("原数组:\n"); printArray(arr, n); radixCountingSort(arr, n); printf("排序后的数组:\n"); printArray(arr, n); return 0; } ``` 使用方法: 1. 将上述代码保存为一个名为`radix_counting_sort.c`的文件; 2. 打开终端或命令行窗口,进入代码所在的目录; 3. 输入以下命令编译代码:`gcc radix_counting_sort.c -o radix_counting_sort`; 4. 输入以下命令运行程序:`./radix_counting_sort`。 程序运行结果如下: ``` 原数组: 170 45 75 90 802 24 2 66 排序后的数组: 2 24 45 66 75 90 170 802 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值