(二)实际项目使用的开发语言中排序算法实现

来源:互联网 发布:原材料价格查询软件 编辑:程序博客网 时间:2024/06/05 09:23
一.常用排序算法:冒择插希快归堆。
数组排序算法时间复杂度对比:
算法时间复杂度空间复杂度 最佳平均最差最差QuicksortO(n log(n))O(n log(n))O(n^2)O(log(n))MergesortO(n log(n))O(n log(n))O(n log(n))O(n)TimsortO(n)O(n log(n))O(n log(n))O(n)HeapsortO(n log(n))O(n log(n))O(n log(n))O(1)Bubble SortO(n)O(n^2)O(n^2)O(1)Insertion SortO(n)O(n^2)O(n^2)O(1)Selection SortO(n^2)O(n^2)O(n^2)O(1)Shell SortO(n)O((nlog(n))^2)O((nlog(n))^2)O(1)Bucket SortO(n+k)O(n+k)O(n^2)O(n)Radix SortO(nk)O(nk)O(nk)O(n+k)
二、常用语言底层都使用某种排序算法实现了自己的排序函数:
以java为例,Java 中最常用的有数组和集合排序:Arrays.sort()和Collections.sort()
(1).Java Arrays中提供了对所有类型的排序。其中主要分为Primitive(8种基本类型)和Object两大类。
  基本类型:采用调优的快速排序;
  对象类型:采用改进的归并排序。
源码中的快速排序,主要做了以下几个方面的优化:
  1)当待排序的数组中的元素个数较少时,源码中的阀值为7,采用的是插入排序。尽管插入排序的时间复杂度为0(n^2),但是当数组元素较少时,插入排序优于快速排序,因为这时快速排序的递归操作影响性能。
2)较好的选择了划分元(基准元素)。能够将数组分成大致两个相等的部分,避免出现最坏的情况。
3)根据划分元 v ,形成不变式 v* (<v)* (>v)* v*
普通的快速排序算法,经过一次划分后,将划分元排到素组较中间的位置,左边的元素小于划分元,右边的元素大于划分元,而没有将与划分元相等的元素放在其附近,这一点,在Arrays.sort()中得到了较大的优化。
举例:15、93、15、41、6、15、22、7、15、20
因 7<size<=40,所以在15、6、和20 中选择v = 15 作为划分元。
经过一次换分后: 15、15、7、6、41、20、22、93、15、15. 与划分元相等的元素都移到了素组的两边。
接下来将与划分元相等的元素移到数组中间来,形成:7、6、15、15、15、15、41、20、22、 93.最后递归对两个区间进行排序[7、6]和[41、20、22、93].
(2).Collections sort排序:
集合中对象排序实现:

把这个方法细分为3个步骤:
a.将list装换成一个对象数组
b.将这个对象数组传递给Arrays类的sort方法(也就是说collections的sort其实本质是调用了Arrays.sort)
c.排好序后指定list的iterator位置,返回一个排好序的list

(3) Java 7中,内部实现换成了TimSort。是结合了归并排序和插入排序的优点,效率更高,但是发现有潜在的bug。



0 0
原创粉丝点击