今天下午研究了下CountingSort算法,虽然这个算法的效率为O(n),简单测试了一下,确实蛮快的。但是这个算法的限制太多:
数据集必须为正整数。。。(也就是说数据集中不能有负数和小数,连0都不行!!) 因此这个算法的应用范围很小,不过速度确实很快。其实网上已经有很多示例了,不过看和自己写一个示例感觉是完全不一样的,呵呵。。。
问:为什么这个算法能不比较就知道数值的位置呢?
答:因为这个算法引入了”数轴“的概念,”数轴“的作用相当于是一个计数器,记录了每个数值出现的频率,
”数轴“的大小应该为数据集中的最大值,以数据集中的数值作为索引(因此,前提条件是数据集必须都是正整数)
如在数组{1,2,3,4,5,4},”数轴“的大小应该为5 , 具体内容为:{1,1,1,2,1}
然后再计算数据集中的每个数值的位置:其实就是累加”数轴“ 累加后的结果为:{1,2,3,5,6}
因为”数轴“是有序的,因此,可以由”数轴“告诉你数据集中每个数值的位置,如:数值 3在整个数据集的第3位,直接插入即可。
这下明白了吧,关键就是”数轴“是有序的。
上代码:
CountingSort.h:
头文件没啥好注释的。。。
CountingSort.cpp:
测试代码:
所有程序在XP SP3,VC2008在编译通过。
由于求最大值的类没有列出来,干脆我打个包发到资源上去。。。。。这个是整个完整的示例,有需要的朋友可以下载:
http://download.csdn.net/source/1320980