零、说在前面
近期打算复习java的几种排序算法,我会将这些排序算法的实现代码、个人心得、时间复杂度分析,算法间的对比做成一个系列帖子,这里作为那些帖子的汇总而存在。
这个系列的框架会包含:概念、实现、时间空间复杂度、横向对比优缺点 这几个部分。
详情请见下面的各个链接。
一、详情链接
排序算法系列一:选择排序、插入排序 与 希尔排序
排序算法系列二:归并排序、快速排序
二、时间复杂度
我发现网上有些算法的时间复杂度与我的理解有出入,因此我自己画了一个,如有不实之处烦请诸位留言指正,不胜感激。
算法名 | 最好情况 | 最坏情况 | 平均复杂度 | 空间复杂度 |
选择排序 | O() | O() | O() | O(1) |
插入排序 | O(N) | O() | O() | O(1) |
希尔排序 | O(N log N) | O(N log N) | O(N log N) | O(1) |
归并排序 | O(N log N) | O(N log N) | O(N log N) | O(N) |
快速排序 | O(N log N) | O() | O(N log N) | O(1) |
出入点:
1、有人认为快速排序的空间复杂度是 O(N log N),我认为这种算法没有开辟临时空间,因此是O(1)
2、有人觉得希尔排序的最好与最坏的时间复杂度是 O(n*log^2 n),我不知道是不是笔误还是什么,但我认为是 O(N log N)。理由可以见我在在系列一中的描述,或者自己用1~8和8~1来测试一下执行次数,就能理解了。