一,题目
如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)
二,解答
关键:哈希表,空间复杂度O(1)中1的含义(只要是常量就可以)
看上去似乎任何已知的算法都无法做到,如果谁做到了,那么所有的排序方法: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)
这个算法很简单,相信大家都会,只是这个题太过于变态了,一般会把面试者吓住。
分享到:
相关推荐
插入排序的时间复杂度为O(n^2),空间复杂度为O(1)。 三、折半插入排序 折半插入排序是插入排序的一种改进算法。其思想是使用折半查找来找到待插入的位置,从而减少了关键字的比较次数。折半插入排序的时间复杂度为...
壳排序的时间复杂度为O(n log n)到O(n²),空间复杂度为O(1)。壳排序适用于大规模数据的排序,并且比插入排序更高效。 五、归并排序(Merge Sort) 归并排序是一种 Divide-and-Conquer 算法。它的工作原理是:将...
算法的时间复杂度为O(n²),空间复杂度为O(1),是稳定的排序方法。 2. 折半插入排序: 折半插入排序改进了直接插入排序中线性查找插入位置的步骤,采用折半查找来减少比较次数,提高了效率。但其时间复杂度仍为O(n...
- 空间复杂度为 O(1),是一种原地排序算法。 - 不稳定排序算法,当两个相等的数初始顺序不同,在排序后它们的相对位置可能发生变化。 ### 二、插入排序(Insertion Sort) 插入排序通过构建有序序列,对于未排序...
2. 空间复杂度:冒泡排序的空间复杂度为 O(1),因为它不需要额外的存储空间。 3. 稳定性:冒泡排序是稳定的排序算法,它可以维持原始记录的相对顺序。 冒泡排序的优缺 冒泡排序的优点是: * 算法简单易懂,易于...
最坏情况下,需要进行n-1次递归,其空间复杂度为O(n);平均情况,空间复杂度为O(nlogn)。 基准关键字的选取 基准关键字的选取是决定快速排序算法的关键,常用的基准关键字的选取方式包括: * 三者取中:将序列首...
除了这些基本的排序方法,还会讨论它们在不同情况下的综合比较,包括稳定性、空间复杂度、排序速度等因素。稳定排序是指相同的元素在排序后相对位置不变,例如插入排序和归并排序是稳定的,而快速排序和堆排序则不是...
- **空间复杂度**:O(1),因为是原地排序算法。 - **稳定性**:插入排序是稳定的排序算法。 #### 10.3 快速排序 - **基本思想**:采用分治策略,选择一个基准元素,将数组分为两部分,使得一部分的所有元素都小于...
其思想是,在要排序的一组数中,假设前面(n-1)个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。直接插入排序是稳定的,算法时间复杂度O(n2)...
插入排序、冒泡排序的空间复杂度为O(1),而堆排序和归并排序需要额外空间,其中归并排序的空间复杂度最高,为O(n),答案是(D)归并排序。 填空题部分涉及了更多细节,如数据的物理结构(顺序和链接)、完全二叉树的...
时间复杂度是衡量排序效率的重要指标,简单的排序方法如冒泡排序和简单选择排序的时间复杂度为O(n^2),而更先进的方法如快速排序和归并排序的时间复杂度为O(n log n)。基数排序则以其O(d·n)的时间复杂度独树一帜,d...
| 插入排序 | O(n)/O(n^2)/O(n^2) | O(1) | 稳定 | | 快速排序 | O(nlogn)/O(nlogn)/O(n^2) | O(logn) | 不稳定 | | 堆排序 | O(nlogn)/O(nlogn)/O(nlogn) | O(1) | 不稳定 | | 归并排序 | O(nlogn)/O(nlogn)/O...
堆排序算法的优势在于它的时间复杂度为O(nlogn),且空间复杂度为O(1),因为排序是在原地进行的,不需要额外的存储空间。然而,由于它的不稳定性(相同元素的相对顺序可能会改变),在某些应用中可能不如其他稳定的...
19. **堆排序的时间复杂度**:第十九题分析了堆排序中筛运算和整体排序的时间复杂度,筛运算通常为`O(log n)`,堆排序的总时间复杂度为`O(n log n)`。 20. **散列存储**:第二十题可能涉及散列函数的选择和冲突解决...
第四题考察了栈的基本操作,题目给出了一个栈的初始状态以及一系列入栈和出栈操作,要求学生判断最后的状态。通过分析给出的操作序列,可以推断出最终栈的状态。正确答案需要通过模拟具体操作来得出。 ### 树结构 ...
根据给定的信息,本文将详细介绍C/C++中的10种排序算法:冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、拓扑排序、基数排序以及锦标赛排序。 ### 一、冒泡排序 冒泡排序是一种简单的排序...
插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间),因此空间复杂度为O(1)。 ### 插入排序的基本思想 插入排序的基本思想可以概括为:每次从未排序的元素中取出一个元素,将其插入到前面已经...
**知识点解析**: 第十一题要求选出平均时间复杂度为O(nlogn)的排序算法。快速排序的平均时间复杂度为O(nlogn),而冒泡排序、希尔排序和选择排序的平均时间复杂度分别为O(n^2)、O(n^2)和O(n^2)。因此,正确答案是B,...
同时,由于它不需要额外的存储空间,所以空间复杂度为O(1),这使得它在内存有限的环境中特别有用。然而,由于其交换次数较多,对于已经部分排序的数据,可能不如插入排序等算法效率高。 总的来说,通过堆排序的动画...