时间复杂度为O(n)的排序算法,你会吗?——其实很简单的
2016-12-21 22:15
162 查看
看上去似乎任何已知的算法都无法做到,如果谁做到了,那么所有的排序方法:QuickSort,ShellSort,HeapSort,BubbleSort等等等等,都可以扔掉了,还要这些算法干吗阿,呵呵。
我们平常知道是排序算法都是O(n),最好的情况也就是O(nlogn),怎么会有O(n)的呢。
不过实际上,在数字范围有限制的情况下,(必须是数字才行的吧)是有一个这样的算法的,只需要用一个数组记录每个数字出现次数就可以了。
假定你的数字范围在0到65535范围之内,定义一个数组count[65536](这个空间是常量,和n无关,所以是O(1) ),初值全部为0。
那么假设有下面这些数字:
100
200
300
119
0
6
...
那么对于每个这个数字,都做在count中记录一下:
100 => count[100]++
200 => count[200]++
300 => count[300]++
119 => count[119]++
0 => count[0]++
6 => count[6]++
...
最后,遍历一边所有这些数字就可得到0~65535每个数字的个数(在count数组中),然后再顺序遍历count数组,count
= m,则输出m个n,(比如说有count[3] = 2, 那么说明有2个数字3),依次输出,最后可得结果。第一次遍历是O(n),第二次遍历是O(1),为常量,所以最后的时间复杂度为O(n),而空间复杂度为O(1)
这个算法很简单,相信大家都会,只是这个题太过于变态了,一般会把面试者吓住
我们平常知道是排序算法都是O(n),最好的情况也就是O(nlogn),怎么会有O(n)的呢。
不过实际上,在数字范围有限制的情况下,(必须是数字才行的吧)是有一个这样的算法的,只需要用一个数组记录每个数字出现次数就可以了。
假定你的数字范围在0到65535范围之内,定义一个数组count[65536](这个空间是常量,和n无关,所以是O(1) ),初值全部为0。
那么假设有下面这些数字:
100
200
300
119
0
6
...
那么对于每个这个数字,都做在count中记录一下:
100 => count[100]++
200 => count[200]++
300 => count[300]++
119 => count[119]++
0 => count[0]++
6 => count[6]++
...
最后,遍历一边所有这些数字就可得到0~65535每个数字的个数(在count数组中),然后再顺序遍历count数组,count
= m,则输出m个n,(比如说有count[3] = 2, 那么说明有2个数字3),依次输出,最后可得结果。第一次遍历是O(n),第二次遍历是O(1),为常量,所以最后的时间复杂度为O(n),而空间复杂度为O(1)
这个算法很简单,相信大家都会,只是这个题太过于变态了,一般会把面试者吓住
相关文章推荐
- 时间复杂度为O(n)的排序算法,你会吗?——其实很简单的
- 时间复杂度为O(n)的排序算法,你会吗?——其实很简单的
- 排序算法——希尔排序的图解、代码实现以及时间复杂度分析
- n个无序整数,已知第i个数在排好序的序列中的位置为j,满足|i-j|<=K,请设计一种排序算法,对该序列进行排序。注:算法时间复杂度为O(nlgn)的得0分,复杂度为O(nk) 的得两分,总分是20分
- 各种排序算法的稳定性和时间复杂度小结
- 各种排序算法的稳定性和时间复杂度小结
- Java实现:排序算法--时间复杂度为O(n² )
- 各种排序算法的稳定性和时间复杂度小结
- 各种排序算法的时间复杂度
- 实现排序算法,时间复杂度为O(n)
- 各种排序算法的稳定性和时间复杂度小结
- 各种排序算法的稳定性和时间复杂度小结
- 各种排序算法的稳定性和时间复杂度小结
- 排序算法空间、时间复杂度
- 计数排序,传说中时间复杂度O(n+k)的排序算法
- 各种排序算法的稳定性和时间复杂度小结
- 各种排序算法的稳定性和时间复杂度小结
- 各种排序算法的稳定性和时间复杂度小结
- 各种排序算法的稳定性和时间复杂度小结
- 排序算法的稳定性和时间复杂度分析