今天学了基数排序,据说他的时间复杂度也是O(n),他的思路就是:
没有计数排序那么理想,我们的数据都比较集中,都比较大,一般是4,5 位。基本没有小的数据。
那我们的处理很简单,你不是没有小的数据嘛。我给一个基数,例如个位,个位都是[0-10)范围内的。先对他进行归类,把 小的放上面,大的放下面,然后个位排好了,在来看10位,我们也这样把小的放上面,大的放下面,依次内推,直到最高位排好。那么不就排好了吗?我们只需要 做d(基数个数)的循环就可以了。时间复杂度相当于O(d * n) 因为d为常量,例如5位数,d就是5.所以近似为O(n)的时间复杂度。这次自己写个案例:
最初的数据 | 排好个位的数据 | 排好十位的数据 | 排好百位的数据 |
981 | 981 | 725 | 129 |
387 | 753 | 129 | 387 |
753 | 955 | 753 | 456 |
129 | 725 | 955 | 725 |
955 | 456 | 456 | 753 |
725 | 387 | 981 | 955 |
456 | 129 | 387 | 981 |
这里只需循环3次就出结果了。
<!--[if !supportLists]-->3. <!--[endif]-->但是注意,我们必须要把个位排好。但是个位怎么排呢?这个是个问题。书上说的是一叠一叠的怎么合并,我是没有理 解的。希望知道的有高手教我一下。
我是用的一个计数排序来排各位的,然后排十位。效率应该也低不到哪里去。呵呵。。
思路就这样咯。奉上源代码: