搜索
简帛阁>技术文章>【编程题目】如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)

【编程题目】如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)

转自:http://blog.csdn.net/vast_sea/article/details/8167968

看上去似乎任何已知的算法都无法做到,如果谁做到了,那么所有的排序方法: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)
这个算法很简单,相信大家都会,只是这个题太过于变态了,一般会把面试者吓住

转自:http://blogcsdnnet/vast_sea/article/details/8167968看上去似乎任何已知的算法都无法做到,如果谁做到了,那么所有的排序方法:QuickSort,S
在LeetCode中看到判断回文的程序:https://leetcodecom/problems/palindromelinkedlist/里面用单链表来存储数据,先反转前半部分的单链表,然后分别从表
算法基础~链表~求两个链表的交点(时间复杂度O(n)、空间复杂度O(1))1,接着上一篇的优化思路:https://wwwcnblogscom/shan333/p/15033376html2,还记得
本随笔来源于《剑指offer》第二版面试官:请实现一个排序算法,要求时间效率为O(n)。应聘者:什么数字进行排序,有多少个数字?面试官:我们相对公司的所有员工的年龄排序。我们公司一共有几万名员工。应
orris遍历是二叉树遍历算法的超强进阶算法,跟递归、非递归(栈实现)的空间复杂度,morris遍历可以将非递归遍历中的空间复杂度降为O(1)。从而实现时间复杂度O(N),而空间复杂度O(1)的
Java中Set和List集合的contains()方法,检查数组链表中是否包含某元素检查数组链表中是否包含某元素,使用Set而不使用List的原因是效率问题,前者的setcontains()方法实现
importjavautilScanner;/***迪杰斯特拉算法:单源点到其他点的最短路径及距离*/publicclassPtest{//不能设置为IntegerMAX_VALUE,否则两个Inte
相信很多开发的同伴们在研究算法、排序的时候经常会碰到O(1),O(n),O(logn),O(nlogn)这些复杂度,看到这里就会有个疑惑,这个O(N)到底代表什么呢?首先o(1),o(n),o(log
计数排序计数排序是一个非基于比较的排序算法,该算法于1954年由HaroldHSeward提出。它的优势在于在一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序
1、原理:对于数组中所有的元素,利用元素每一位的值进行排序,如十进制元素数组[342,254,87],则先个位排序,再十位排序,最后百位排序。由于十进制每一位范围为09,因此按位排序的过程调用计