最近一个项目牵涉到大量数据的排序和查找。虽然我们知道了几种常用算法,但是他们的效率究竟怎么样,适合什么样的情况也没有见到说明文档。
下面我就来比较一下下面三种算法(用ArrayList.Sort()作为比较对象):
说明一下:1.该程序主要正对于无序数组,字符以及其他排序并不适合
2.要求数组中的元素全为自然数,非自然数的情况并未测试
3.数组元素个数指的是:该数组中的项数
4.范围值的是该数组中生成随机元素时元素的范围,为了简单我们默认为1-?
5.左边的时间是我们算法的时间,右边的时间是ArrayList的排序时间。
好了,先来看看计数排序的方式:
计数排序:
1.元素个数很多,跨度很小
2.元素个数很少,跨度很大
3.元素个数与元素跨度相对集中
由此可以看出:
1.当元素个数很多而且元素的跨度并不是很大的时候,用计算排序效率是很高的。
2.相反,元素个数很少,跨度很大时,它的效率就很差了
3.当元素个数和元素跨度在一个相对集中的情况下,两种排序方式效率差不多(ArrayList稍快)。
接下来我们看看冒泡排序:
1.元素个数很多,跨度很小
2.元素个数很少,跨度很大
3. 元素个数与元素跨度相对集中
冒泡法总结:
1.在元素很多的时候,我们发现冒泡排序还是存在一定优势的,但是与计数排序相比效率还是差了很多了。
2.元素个数很少,跨度很大,这总方式冒泡最在行了,效率还是很不错的。
3. 元素个数与元素跨度相对集中,在这种情况下,冒泡排序的效率比ArrayList效率还是要高点。
3.插入排序
1.元素个数很多,跨度很小
2.元素个数很少,跨度很大
3. 元素个数与元素跨度相对集中
插入排序总结:
1.在元素很多的时候,插入排序的方式需要移动很多次数组中的值,效率就相对很低了。
2.元素个数很少,跨度很大。这两种算法的效率都很快。
3. 元素个数与元素跨度相对集中,在这种情况下,插入排序的优势就体现出来了。
总结:以上的测试基于随机数组,数组不具有任何可以观察的特点,测试数据满足一般情况,但是在有的特定数组中,我们应该关注数组的特殊性,通过数组的特性来选择相应的排序算法,最终实现高效率的排序。
根据以上的测试结果,我个人觉得ArrayList的Sort的排序方法是一个值得相信的通用排序方案,在不是很追求效率的情况下,采用系统的排序方法是可行的。
下面来看看一个折半查找算法
系统的查找方法和折半查找的方法效率几乎一样,我都在猜想他们系统是不是采用的折半查找方法了。由于其他原因我也不想去找了,有知道的朋友可以告诉我,谢谢了。
哈希查找由于不适合我做的项目,所以我也就没有去测试了。
我的联系方式:QQ:125941562,Email:bobui@163.com
有什么问题欢迎大家一起讨论交流。
文档地址 http://download.csdn.net/source/1819765