Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2115603
  • 博文数量: 438
  • 博客积分: 3871
  • 博客等级: 中校
  • 技术积分: 6075
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-10 00:11
个人简介

邮箱: wangcong02345@163.com

文章分类

全部博文(438)

文章存档

2017年(15)

2016年(119)

2015年(91)

2014年(62)

2013年(56)

2012年(79)

2011年(16)

分类: LINUX

2016-08-10 09:56:40

1. 基数排序



1.2 代码
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define dbmsg(fmt, args ...) printf("%s:%s[%d]: "fmt"\n", __FILE__,__FUNCTION__, __LINE__,##args)
  4. int dump_array(int* arr, int len)
  5. {
  6.     int i;
  7.     for(i=0; i<len; i++)
  8.     {
  9.         printf("%d=0x%x ", arr[i], arr[i]);
  10.     }
  11.     printf("\n");
  12.     return 0;
  13. }
  14. int get_position_num(int data,int pos)
  15. {
  16.     return( (data>>(4*(pos-1)))&0xF );
  17. }
  18. #define BUCKET_NUM 16
  19. #define INT_BITS 32 //int 32bits 32/4
  20. void radix_sort(int* arr, int len)
  21. {
  22.     int i,j, k, num_pos;
  23.     int num, index;
  24.     int *bucket[BUCKET_NUM];
  25.     for(i=0; i<BUCKET_NUM; i++)
  26.     {
  27.         bucket[i] = (int *)malloc(sizeof(int) * (len + 1));   //一共16个bucket,每个bucket的大小是len,所以占用16*len个空间
  28.         bucket[i][0] = 0;                             //bucket[i][0]代表这个下标的数据的个数
  29.     }
  30.     for(num_pos=1; num_pos<=INT_BITS/4; num_pos++) //32位int最大是0xFFFF FFFF, 8个F,所以要排8次
  31.     {
  32.         for (i=0; i<len; i++)                      //分配过程
  33.         {
  34.             num = get_position_num(arr[i], num_pos);
  35.             printf("num=%d ", num);
  36.             index = ++bucket[num][0];
  37.             bucket[num][index] = arr[i];
  38.         }
  39.         printf("\n");

  40.         for(i=0, j=0; i<BUCKET_NUM; i++)              //收集
  41.         {
  42.             for (k=1; k<=bucket[i][0]; k++)           //将桶中的数据按下标由小到大, 
  43.                 arr[j++] = bucket[i][k];
  44.             bucket[i][0] = 0; //复位
  45.         }
  46.         dump_array(arr, len);
  47.     }
  48.     for (i=0; i<BUCKET_NUM; i++)
  49.     {
  50.         if(NULL != bucket[i])
  51.             free(bucket[i]);
  52.     }
  53. }

  54. int main ( int argc, char *argv[] )
  55. {
  56.     //int arr[] = {49, 38, 65, 97, 76, 13, 27, 49};
  57.     int arr[] = {49, 38, 65, 97, 76, 13, 27, 49, 55, 4, 0x321, 0x4321, 0x54321, 0x123, 0x1234, 0x12345};
  58.     int len = sizeof(arr)/sizeof(int);
  59.     dbmsg("array len=%d", len);
  60.     dump_array(arr, len);
  61.     radix_sort(arr, len);
  62.     printf("after merge sort\n");
  63.     dump_array(arr, len);
  64.     return EXIT_SUCCESS;
  65. }
注: 为什么需要分配一次收集一次呢?
    第1次将个位数
    第2次 对于同一个bucket来说个位数小的先进入bucket,个位数大的后进入bucket,
              所以对于这一个bucket来说,十位数相同,个位数是从小到大
     第3次 对于这一个bucket来说,百位数相同,剩余的两位由小到大
    .....
    最后    对于这一个bucket来说,最高位数相同,剩余的位数由小到大

  把bucket输出不就是有序的数了嘛。

第一趟以第1个F为基数进行排序
  1. 0
  2. 1 49=0x31 65=0x41 97=0x61 49=0x31
  3. 2
  4. 3
  5. 4 4=0x4
  6. 5
  7. 6 38=0x26
  8. 7 55=0x37
  9. 8
  10. 9
  11. A
  12. B 27=0x1b
  13. C 76=0x4c
  14. D 13=0xd
  15. E
  16. F

第二趟以第2个F为基数进行排序
  1. 0 4=0x4 13=0xd
  2. 1 27=0x1b
  3. 2 38=0x26
  4. 3 49=0x31 49=0x31 55=0x37   -->此时就能保证个位数有序
  5. 4 65=0x41 76=0x4c
  6. 5
  7. 6 97=0x61
  8. 7
  9. 8
  10. 9
  11. A
  12. B
  13. C
  14. D
  15. E
  16. F

1.4 代码打包
 8radix.rar(下载后改名为8radix.tar.gz)

阅读(1191) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~