算法---8.基数排序

来源:互联网 发布:king of the hill知乎 编辑:程序博客网 时间:2024/04/28 23:16
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. 1 49=0x31 65=0x41 97=0x61 49=0x31
  2. 2
  3. 3
  4. 4 4=0x4 
  5. 5
  6. 6 38=0x26
  7. 7 55=0x37
  8. 8
  9. 9
  10. A
  11. B 27=0x1b
  12. C 76=0x4c
  13. D 13=0xd 
  14. E
  15. 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. 8
  9. 9
  10. A



  11. E
  12. F

1.4 代码打包
 8radix.rar(下载后改名为8radix.tar.gz)
0 0
原创粉丝点击