免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4016 | 回复: 0
打印 上一主题 下一主题

[算法] C语言基数排序算法实现 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-10-26 16:59 |只看该作者 |倒序浏览
这里的基数排序用LSD方法,即从最右边位开始,把位数相同的放在一起,这步需要把数组按这个规则分配到一个二维数组,分配完后,再把这个二维数组从新顺序放回到原来数组。
然后从右二位开始,重复以上,直到数组里面位数最高的数都分配过。最后放回原来数组的时候,整个数组就是顺序的了。还有就是要先知道数字位数的范围,这里最多为3位数。
整个算法很好理解,主要是程序里面的处理位数,复制数组很麻烦,不小心就错了。
  1. #include <stdio.h>

  2. void print_arr(int *arr, int arr_len);
  3. void radixsort(int *arr, int base_bit, int arr_len);
  4. long power_int(int base_n, int exp);

  5. int
  6. main()
  7. {
  8.   int arr[] = {512, 51, 13, 6, 61, 40, 72, 93, 49, 25, 201, 364};
  9.   int base_bit = 3;
  10.   int arr_len = sizeof(arr) / sizeof(arr[0]);
  11.   print_arr(arr, arr_len);
  12.   radixsort(arr, base_bit, arr_len);
  13.   print_arr(arr, arr_len);
  14.   return 0;
  15. }

  16. void
  17. radixsort(int *arr, int base_bit, int arr_len)
  18. {
  19.   int temp_arr[10][arr_len];
  20.   long max_base;
  21.   max_base = power_int(10, base_bit);
  22.   int base = 1;
  23.   int i, j;
  24.   int bit;
  25.   int count[10] = {0};
  26.   int k = 0;
  27.   while (base <= max_base) {
  28.     for (i = 0; i < arr_len; i++) {
  29.       bit = (arr[i] / base) % 10;
  30.       temp_arr[bit][count[bit]] = arr[i];
  31.       count[bit]++;
  32.     }
  33.     for (i = 0; i < 10; i++) {
  34.       if (count[i] != 0) {
  35.         for (j = 0; j < count[i]; j++) {
  36.           arr[k] = temp_arr[i][j];
  37.           k++;
  38.         }
  39.         count[i] = 0;
  40.       }
  41.     }
  42.     base *= 10;
  43.     k = 0;
  44.   }

  45. }

  46. void
  47. print_arr(int *arr, int arr_len)
  48. {
  49.   int i = 0;
  50.   while (i < arr_len) {
  51.     printf("%d ", arr[i]);
  52.     i++;
  53.   }
  54.   printf("\n");
  55. }

  56. long
  57. power_int(int base_n, int exp)
  58. {
  59.   int i;
  60.   long result = 1;
  61.   for (i = 1; i < exp; i++) {
  62.     result *= base_n;
  63.   }
  64.   return result;
  65. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP