`
happmaoo
  • 浏览: 4430346 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

一道看上去很吓人的算法面试题:如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)

阅读更多
<iframe align="top" marginwidth="0" marginheight="0" src="http://www.zealware.com/46860.html" frameborder="0" width="468" scrolling="no" height="60"></iframe>
看上去似乎任何已知的算法都无法做到,如果谁做到了,那么所有的排序方法:QuickSort,ShellSort,HeapSort,BubbleSort等等等等,都可以扔掉了,还要这些算法干吗阿,呵呵。不过实际上,在数字范围有限制的情况下,是有一个这样的算法的,只需要用一个数组记录每个数字出现次数就可以了。
假定你的数字范围在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[n] = m,则输出m个n,(比如说有count[3] = 2, 那么说明有2个数字3),依次输出,最后可得结果。第一次遍历是O(n),第二次遍历是O(1),为常量,所以最后的时间复杂度为O(n),而空间复杂度为O(1)
这个算法很简单,相信大家都会,只是这个题太过于变态了,一般会把面试者吓住(我原来面试也出过这个题,只不过题目的表述形式要“友善”的多,呵呵)


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1589603


分享到:
评论

相关推荐

    根号n段归并排序算法时间复杂度分析过程

    对于每个单独的段,由于其大小不超过sqrt(n),我们可以使用线性时间复杂度O(sqrt(n))的简单排序方法(如插入排序)来对它们进行排序。然后,我们开始自底向上的归并过程,将相邻的两个已排序的段合并。每次合并操作...

    排序算法时间复杂度的研究.pdf

    - 时间复杂度:计数排序的时间复杂度主要取决于输入数据的范围 \(k\) 和输入数据的数量 \(n\),通常表示为 \(O(n+k)\)。在最坏的情况下,即所有元素的值域都不同且非常大时,时间复杂度退化为 \(O(n^2)\)。 #### 2....

    排序算法时间复杂度的分析java语言描述

    - 时间复杂度:快速排序的平均时间复杂度为O(n log n),但在最坏情况下(输入序列已排序或逆序)时间复杂度为O(n²)。通常,快速排序被认为是实际应用中最快的排序算法之一。 5. **插入排序(Insertion Sort)** ...

    学习电脑信息常用的排序算法的时间复杂度和空间复杂度

    下面是常用的排序算法的时间复杂度和空间复杂度: 冒泡排序:时间复杂度 O(n2),空间复杂度 O(1) 快速排序:时间复杂度 O(nlog2n),空间复杂度 O(log2n)~O(n) 选择排序:时间复杂度 O(n2),空间复杂度 O(1) ...

    桶排序的时间复杂度的计算公式.docx

    1. 桶内排序的时间复杂度:如果每个桶都使用插入排序,那么每个桶的时间复杂度为O((n/k)²),因为插入排序在最坏情况下需要O(n²)的时间。所以,所有桶的总时间复杂度为O(k * (n/k)²) = O(n²/k)。 2. 合并桶的...

    各种排序算法时间复杂度1

    - 空间复杂度:O(log2N)~O(n) - 快速排序通过选取枢轴元素进行分区,然后递归排序两部分,一般情况下高效,但最坏情况下时间复杂度较高。 7. **归并排序**: - 最好、平均、最坏情况:O(N*log2N) - 空间复杂度...

    各种排序算法的稳定性和时间复杂度总结

    插入排序的时间复杂度同样为O(n^2),但在最好的情况下(列表已排序),其时间复杂度为O(n)。插入排序也是稳定的,因为插入操作不会改变相等元素的相对顺序。 #### 3. 归并排序 归并排序采用分治策略,将列表分为两...

    算法的时间复杂度和空间复杂度

    算法思想是,在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将...

    算法 时间复杂度 空间复杂度 经典

    - 设算法中基本操作的执行次数为 \( T(n) \),如果存在正整数 \( c \) 和非负整数 \( n_0 \),使得当 \( n &gt; n_0 \) 时,有 \( T(n) \leq c \cdot f(n) \),则称 \( f(n) \) 为算法的时间复杂度,记作 \( T(n) = O...

    排序算法在不同数组状态下时间复杂度的比较

    而当数据量较大,且对效率有较高要求时,优先选择时间复杂度为O(n log n)的算法,如归并排序、快速排序或堆排序。在实际应用中,通常会结合具体情况和性能需求选择合适的排序算法。 通过分析`main.cpp`等源代码文件...

    排序算法时间复杂度的研究

    - **插入排序**: 平均/最好/最坏时间复杂度分别为O(n^2)、O(n)、O(n^2),空间复杂度为O(1)。 - **希尔排序**: 平均/最坏时间复杂度介于O(nlogn)至O(n^2)之间,具体取决于增量序列的选择,空间复杂度为O(1)。 - **...

    基于C语言的常见的8种排序的时间复杂度比较算法

    堆排序的时间复杂度为O(n log n),但相比其他O(n log n)算法,其常数因子较大。 7. 计数排序(Counting Sort) 计数排序是一种非基于比较的排序算法,适用于整数排序。它通过计算每个元素在待排序序列中出现的次数...

    数据结构时间复杂度

    - 例如,在两个数组之间进行比较或合并时,如果每个元素都需要与另一个数组中的每个元素进行比较,则时间复杂度为 \( O(n^2) \)。 #### 四、实例分析 1. **常数阶实例**: - 考虑以下代码片段: ```c int sum ...

    12种排序及时间复杂度稳定性

    快速排序平均时间复杂度为O(n log n),最坏情况为O(n^2)。快速排序是不稳定的。 9. 希尔排序(Shell sort): 是插入排序的一种改进版,通过设置间隔序列,逐步减小间隔进行排序。希尔排序的时间复杂度取决于间隔...

    快速排序与归并排序的时间复杂度分析

    快速排序的时间复杂度在最好情况下为O(n log n),最坏情况下为O(n^2),平均情况也是O(n log n)。由于在每一轮划分中,元素的移动次数可能小于比较次数,所以快速排序通常被认为是实际应用中效率较高的排序算法。但其...

    算法基础:算法概念,时间复杂度 ,空间复杂度

    3. O(n):线性时间复杂度,表示算法的执行时间随输入规模的线性增加。 4. O(nlogn):线性对数时间复杂度,表示算法的执行时间随输入规模的线性对数增加。 5. O(n2):平方时间复杂度,表示算法的执行时间随输入规模的...

    排序算法比较 时间复杂度 稳定性描述

    本文将对几种常见的排序算法进行对比分析,包括它们的时间复杂度和稳定性特点,以便读者能够更好地理解每种算法的适用场景。 #### 1. 插入排序 **时间复杂度**: - 最好情况:当输入数组已经是有序的,时间复杂度...

    排序算法的时间复杂度分析

    在最好情况下,即待排序的数据已经是有序的,选择排序仍会进行n(n-1)/2次比较,因此其最好情况时间复杂度为O(n^2)。在最坏情况下,即待排序的数据完全逆序,选择排序同样需要进行n(n-1)/2次比较,时间复杂度同样是O...

Global site tag (gtag.js) - Google Analytics