(C语言)八大排序之:基数排序

reference: 基数排序 http://blog.csdn.net/hitwhylz/article/details/9970451

                 八大排序 https://www.cnblogs.com/RainyBear/p/5258483.html

基数排序radixSort: 用桶bucket进行 分配、收集。

              桶:0-9十个桶

             分配:从个位开始,将数据分配到0-9桶中

             收集:依次将0-9桶中的数据收集到原数组中

时间复杂度:O(d(r+n))   空间复杂度:O(rd+n)   。

其中,n为关键字的个数、d为关键字最大的长度、r为关键字的基数即桶的数量

              基数排序的空间复杂度较高,有两个数组的空间开销:一个存放待排序数组,一个就是所谓的桶


  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 
  4 void radixSort(int a[], int len);
  5 void display(int a[], int len);
  6 
  7 int main(void)
  8 {
  9         int a[] = {8,4,2,3,5,1,6,9,0,7};
 10         int len = sizeof(a)/sizeof(a[0]);
 11         radixSort(a, len);
 12 
 13         display(a, len);
 14         return 0;
 15 }
 16 // 数组中最大数的位数
 17 int maxlength(int a[], int len)
 18 {
 19         int bits = 1, p = 10, i;
 20         for(i=0; i<len; i++)
 21         {
 22                 while(a[i]>=p)
 23                 {
 24                         p = p * 10;
 25                         bits++;
 26                 }
 27         }
 28         return bits;
 29 }
 30 
 31 // 数据num的第pos位的数字,pos=1为个位
 32 int getdigit(int num, int pos)
 33 {
 34         int temp = 1, i;
 35         for(i=0; i<pos-1; i++)
 36                 temp = temp * 10;
 37         return (num/temp) % 10;
 38 }
 39 
 40 void radixSort(int a[], int len)
 41 {
 42         int *bucket[10];        // 指针数组, 0-9的十个桶
 43         int i;
 44         for(i=0; i<10; i++)
 45         {       // 指针数组,每个指针都指向一个容量为len+1的桶
 46                 bucket[i] = (int *)malloc(sizeof(int) * (len+1)); // bucket 桶
 47                 bucket[i][0] = 0; // index为0处记录桶中数据个数
 48         }
 49         int bit; // 数组中最大数的长度,bit=1为个位
 50         for(bit = 1; bit<=maxlength(a, len); bit++) // 从个位开始比较
 51         {
 52                 for(i=0; i<len; i++)    // 分配
 53                 {
 54                         int num = getdigit(a[i], bit);
 55                         int index = ++bucket[num][0];
 56                         bucket[num][index] = a[i];
 57                 }
 58                 int index = 0;
 59                 for(i=0; i<10; i++)     // 收集
 60                 {
 61                         int j;
 62                         for(j=1; j<=bucket[i][0]; j++)
 63                                 a[index++] = bucket[i][j]; // 收集到原数组中
 64                         bucket[i][0] = 0;       // 复位,每个桶中的数据个数
 65                 }
 66         }
 67 }
 68 
 69 void display(int a[], int len)
 70 {
 71         int i;
 72         for(i=0; i<len; i++)
 73                 printf("%d ", a[i]);
 74         printf("\n");
 75 }

猜你喜欢

转载自blog.csdn.net/trb331617/article/details/79446936