桶排序之后 --- > 基数排序

迷南。 2022-03-20 01:42 333阅读 0赞

和桶排序一样,也不是基于比较的。

基数排序一般用于整数的处理,它的基本原理是:一直想把它说的更白话一点,可是,哎。。。

我们可以想象一下,如果现在只有几个各位数 2 6 3 7 ,

那么装入数组后是 :

![Image 1][]

1363424135_5355.jpg

修改相应的位置后:

1363424283_2692.jpg

那么再由后往前扫描,7 -> 3 -> 6 -> 2

对应到位置后为:2 3 6 7 已经排好序了。。。

那么对于两位呢?我们想象一下,例如一趟后的顺序是:23 34 26 27 17 我们可以看看个位数,显然是排序好的一次!那么再有10位数处理,10位数大的必然放到后面,由于个位数已经排好序,那么对于同样十位数的数据在第二次排序的时候,必有 前面的数十位数==后面数的十位数,前面的个位数 < 后面个位数( 因为算法稳定性 )。所以就这样结束了。。。。

不好意思,语言表达不好啊,哎,给一个动画链接:http://www.cs.usfca.edu/~galles/visualization/radix_sort.html

CODE:( 在九度OJ上已经通过,不过最后一个超级大数据的时候TLE了,5555…,但是算法实现应该正确 )

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void radix_count(int* idx, int m, int* p_data, int len)
  4. {
  5. int* p_count = (int*)malloc(sizeof(int)* m);
  6. int* p_sort = (int*)malloc(sizeof(int) * len);
  7. int i = 0;
  8. for (i = 0; i < m; ++i)
  9. {
  10. p_count[i] = 0;
  11. }
  12. for (i = 0; i < len; ++i)
  13. {
  14. ++p_count[idx[i]];
  15. }
  16. for (i = 1; i < 10; ++i)
  17. {
  18. p_count[i] += p_count[i - 1];
  19. }
  20. for (i = len - 1; i >= 0; --i)
  21. {
  22. p_count[idx[i]]--;
  23. p_sort[p_count[idx[i]]] = p_data[i];
  24. }
  25. for (i = 0; i < len; ++i)
  26. {
  27. p_data[i] = p_sort[i];
  28. }
  29. free(p_sort);
  30. free(p_count);
  31. }
  32. void radix_sort(int* p_data, int len)
  33. {
  34. int* radix_data = (int*)malloc(sizeof(int) * len);
  35. int start = 1;
  36. int flag = 0;
  37. int i;
  38. while (!flag)
  39. {
  40. flag = 1;
  41. start *= 10;
  42. i = 0;
  43. for (i = 0; i < len; ++i)
  44. {
  45. radix_data[i] = p_data[i] % start;
  46. radix_data[i] /= start / 10;
  47. if (radix_data[i] > 0)
  48. {
  49. flag = 0;
  50. }
  51. }
  52. if (flag)
  53. {
  54. break;
  55. }
  56. radix_count(radix_data, 10, p_data, len);
  57. }
  58. free(radix_data);
  59. }
  60. int main()
  61. {
  62. int a[1000];
  63. int i, n;
  64. while( scanf("%d", &n) != EOF )
  65. {
  66. for(i = 0; i < n; i++ )
  67. {
  68. scanf("%d", &a[i]);
  69. }
  70. radix_sort(a, n);
  71. for (i = 0; i < n; ++i)
  72. {
  73. printf("%d ", a[i]);
  74. }
  75. printf("\n");
  76. }
  77. return 0;
  78. }

[Image 1]:

发表评论

表情:
评论列表 (有 0 条评论,333人围观)

还没有评论,来说两句吧...

相关阅读

    相关 基数排序排序)思路整理

    首先了解一下什么是基数排序: 基数排序是桶排序的扩展,不了解桶排序也没有关系。它是通过待排序列中每个值的各个位,将每个值按照一定规则放置“桶”中,达到排序的效果。(刚刚接触

    相关 排序之后 --- > 基数排序

    和桶排序一样,也不是基于比较的。 基数排序一般用于整数的处理,它的基本原理是:一直想把它说的更白话一点,可是,哎。。。 我们可以想象一下,如果现在只有几个各位数   2