C语言实现简单的基数排序

编程实验

72人已加入

描述

  C语言实现简单的基数排序

  八大排序算法有:冒泡排序、插入排序、选择排序、快速排序、希尔排序、堆排序、归并排序、基数排序。前面七种网上都有很多例子,但是最后一种基数排序却很少看到,所以我总结了一下,并且自己写了一个简单的实现。

  基数排序是一种分配排序,其基本思想是:排序过程无须比较关键字,而是通过“分配”和“收集”过程来实现排序。它们的时间复杂度可达到线性O(n)。基数排序所做的事情,是对N位分别进行排序。从直觉上来看,人们可能会觉得应该首先按最高有效位进行排序,不过这点与我们的直觉相反,基数排序首先对最低有效位数字进行排序。如果我们每次比较r bits,则需要进行b/r趟,每趟进行计数排序需要O(n+2^r),则总的时间复杂度为O(b/r(n+2^r))。

C语言

  理论上来说,基数排序的速度是以上几种排序方法中最快的,可以达到O(N),而其它的排序算法最快也只有O(N*logN)。但是,基数排序需要占用额外的空间,而且只支持整数进行排序。

  实现代码如下:

  #include

  #include

  /* 获取输入数字的索引值,dec指定数字的位数,3代表百位数,order指定需要获取哪一位的索引,1代表个位,2代表十位,3代表百位 */

  int get_index(int num, int dec, int order)

  {

  int i, j, n;

  int index;

  int div;

  /* 根据位数,循环减去不需要的高位数字 */

  for (i=dec; i>order; i--) {

  n = 1;

  for (j=0; j

  n *= 10;

  div = num/n;

  num -= div * n;

  dec--;

  }

  /* 获得对应位数的整数 */

  n = 1;

  for (i=0; i

  n *= 10;

  /* 获取index */

  index = num / n;

  return index;

  }

  /* 进行基数排序 */

  void radix_sort(int array[], int len, int dec, int order)

  {

  int i, j;

  int index; /* 排序索引 */

  int tmp[len]; /* 临时数组,用来保存待排序的中间结果 */

  int num[10]; /* 保存索引值的数组 */

  memset(num, 0, 10*sizeof(int)); /* 数组初始清零 */

  memset(tmp, 0, len*sizeof(int)); /* 数组初始清零 */

  if (dec < order) /* 最高位排序完成后返回 */

  return;

  for (i=0; i

  index = get_index(array[i], dec, order); /* 获取索引值 */

  num[index]++; /* 对应位加一 */

  }

  for (i=1; i<10; i++)

  num[i] += num[i-1]; /* 调整索引数组 */

  for (i=len-1; i>=0; i--) {

  index = get_index(array[i], dec, order); /* 从数组尾开始依次获得各个数字的索引 */

  j = --num[index]; /* 根据索引计算该数字在按位排序之后在数组中的位置 */

  tmp[j] = array[i]; /* 数字放入临时数组 */

  }

  for (i=0; i

  array[i] = tmp[i]; /* 从临时数组复制到原数组 */

  printf(“the %d time\n”, order);

  for (i=0; i<30; i++)

  printf(“%d ”, array[i]);

  printf(“\n”);

  /* 继续按高一位的数字大小进行排序 */

  radix_sort(array, len, dec, order+1);

  return;

  }

  int main(int argc, char *argv[])

  {

  int i;

  int array[30] = {258, 976, 515, 337, 359, 701, 916, 494, 303, 175,

  677, 825, 131, 560, 147, 254, 759, 814, 917, 382,

  452, 114, 873, 585, 881, 127, 819, 658, 461, 435};

  int len = 30; /* 测试数据个数 */

  int dec = 3; /* 数据位数,3代表3位数 */

  int order = 1; /* 排序的位数,1代表个位、2代表十位、3代表百位 */

  printf(“before\n”);

  for (i=0; i<30; i++)

  printf(“%d ”, array[i]);

  printf(“\n”);

  /* 排序函数,从个位开始 */

  radix_sort(array, len, dec, order);

  printf(“final\n”);

  for (i=0; i<30; i++)

  printf(“%d ”, array[i]);

  printf(“\n”);

  return 0;

  }

C语言

  运行结果如下:

  baishen@sjtu:~/sort$ 。/radix

  before

  258 976 515 337 359 701 916 494 303 175 677 825 131 560 147 254 759 814 917 382 452 114 873 585 881 127 819 658 461 435

  the 1 time

  560 701 131 881 461 382 452 303 873 494 254 814 114 515 175 825 585 435 976 916 337 677 147 917 127 258 658 359 759 819

  the 2 time

  701 303 814 114 515 916 917 819 825 127 131 435 337 147 452 254 258 658 359 759 560 461 873 175 976 677 881 382 585 494

  the 3 time

  114 127 131 147 175 254 258 303 337 359 382 435 452 461 494 515 560 585 658 677 701 759 814 819 825 873 881 916 917 976

  final

  114 127 131 147 175 254 258 303 337 359 382 435 452 461 494 515 560 585 658 677 701 759 814 819 825 873 881 916 917 976

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分