排序算法——基数排序

来源:互联网 发布:mac 切换java版本 编辑:程序博客网 时间:2024/04/28 23:16

基数排序(Radix sort)是一种排序算法,它是这样实现的:
将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零. 然后, 从最低位开始, 依次进行一次排序.这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列.

基数排序时间复杂度: O(d(n+k))  n个d位数,每个数位有k种取值

Code:
  1. #include <stdio.h>   
  2. #include <stdlib.h>   
  3.   
  4. int max_bit(int a[], int size) /* get the max bit of number */  
  5. {   
  6.     int i, max, b;   
  7.   
  8.     for (i = 1, max = a[0]; i < size; i++) {   
  9.         if (a[i] > max) {   
  10.             max = a[i];   
  11.         }   
  12.     }   
  13.     b = 1;   
  14.     while (max / 10) {   
  15.         b++;   
  16.         max /= 10;   
  17.     }   
  18.     return b;   
  19. }   
  20.   
  21. void radix_sort(int a[], int size)   
  22. {   
  23.     int d = max_bit(a, size);   
  24.     int i, j, k, range, radix;   
  25.     int *c, *b;   
  26.   
  27.     range = 10; /* for counting sort, the range of every bit is 0 - 9 */  
  28.     radix = 1;   
  29.     c = (int *)malloc(sizeof(int) * range);   
  30.     b = (int *)malloc(sizeof(int) * size);   
  31.     for (i = 0; i < d; i++, radix *= 10) {   
  32.            
  33.         /* use counting sort */  
  34.         /* clear count before every sort */  
  35.         for (j = 0; j < range; j++) {    
  36.             c[j] = 0;   
  37.         }   
  38.   
  39.         /* c[k] content the num of elements which equal to k */  
  40.         for (j = 0; j < size; j++) {    
  41.             k = (a[j] / radix) % 10;   
  42.             c[k]++;   
  43.         }   
  44.   
  45.         /* c[j] content the num of elements which equal or less than j */  
  46.         for (j = 1; j < range; j++)    
  47.             c[j] += c[j-1];   
  48.   
  49.         /* put a[j] into the space of b[c[k] - 1] */  
  50.         for (j = size - 1; j >= 0; j--) {    
  51.             k = (a[j] / radix) % 10;   
  52.             b[c[k] - 1] = a[j];   
  53.             c[k]--;   
  54.         }   
  55.   
  56.         /* copy the 'sorted' list to a[j] */  
  57.         for (j = 0; j < size; j++)   
  58.             a[j] = b[j];   
  59.     }   
  60.     free(c);   
  61.     free(b);           
  62. }   
  63.   
  64. main()   
  65. {   
  66.     int a[] = {329, 457, 657, 839, 436, 720, 355}, i;   
  67.     int size = sizeof(a) / sizeof(int);   
  68.     radix_sort(a, size);   
  69.        
  70.     for (i = 0; i < size; i++)   
  71.         printf("%d ", a[i]);   
  72. }  

 

原创粉丝点击