`
tubaluer
  • 浏览: 1445511 次
文章分类
社区版块
存档分类
最新评论
  • sblig: c / c++ 是不一样的都会输出 100
    j = j++

重学数据结构002——桶排序、基数排序

 
阅读更多

1.桶排序

有N个整数,范围是1-M或者是0-M-1。留置一个数组Count,其大小为M,并初始化为0。于是Count有M个单元(或者叫桶)。当Ai被读入时,Count[Ai]增1。当所有的输入被读入,扫描Count,打印输出排序号的列表。桶排序实现代码如下:

  1. #include<stdio.h>
  2. #defineMax10
  3. voidinitArray(intarr[],intlen)
  4. {
  5. intk;
  6. for(k=0;k<len;k++)
  7. {
  8. arr[k]=0;
  9. }
  10. }
  11. voidPrintBucketArray(intBucketArr[],intlen)
  12. {
  13. intj;
  14. for(j=0;j<len;j++)
  15. {
  16. inttmp=BucketArr[j];
  17. while((tmp--)>0)
  18. {
  19. printf("%d\n",j);
  20. }
  21. }
  22. }
  23. /************************************************
  24. *桶排序,输入数组中的数不超过在0-Max-1之间
  25. *
  26. ************************************************/
  27. voidBucketSort(intinput[],intla,intoutput[],intlb)
  28. {
  29. initArray(output,lb);
  30. inti;
  31. for(i=0;i<la;i++)
  32. {
  33. output[input[i]]++;
  34. }
  35. PrintBucketArray(output,lb);
  36. }
  37. intmain(void)
  38. {
  39. inta[10]={9,8,8,5,1,3,3,3,2,2};
  40. intb[Max];
  41. BucketSort(a,10,b,Max);
  42. return0;
  43. }

2.基数排序

基数排序是桶排序的推广:N个数位于0-NP-1之间(P是某个常数)。这种情况下就不适合使用桶排序了一次性搞定。既然不能一次搞定,可以考虑分步骤多次处理。基数排序的思路:每一趟对待排序的数的最低有效位进行桶排序。也就是说,先对每个数按照最低位进行桶排序,然后按照次低位桶排序……
举例是最好的说明。现在有10个数:64、8、216、512、27、729、0、1、343、125。10个数,都落在0-999(10^3-1)之间。
先按照最低位排序得到结果如下:

0 1 512 343 64 125 216 27 8 729
0 1 2 3 4 5 6 7 8 9

然后按照次低位排序,结果得到:

08
01
00

216

512

729

27

125

343 64
0 1 2 3 4 5 6 7 8 9

接着按照倒数第三位排序,结果:

064
027
008
001
000
125 216 343 512 729
0 1 2 3 4 5 6 7 8 9

基数排序代码之后再补上。


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics