O(n)和O(1)时间对数组进行排序
2013-09-11 09:39
162 查看
转载请注明来自souldak,微博:@evagle
题目:给你一个待排序数组,有正有负,要求在O(n)时间和O(1)空间内将数组中的负数放在整数前面,但是负数之间的顺序不变,正数间的顺序也不变(即要求是stable的排序)。例如 -1 1 3 -2 2排序后是-1 -2 1 3 2.
第一想法是quick sort 的partition方法,它可以实现O(n)的时间和O(1)的空间,但是它不是stable的,不能保证正数/负数之间的顺序不变。如果要stable貌似就很难O(n)。其他的方法例如可以修改merge sort得到stable的排序,但是它需要O(nlogn)的时间和O(n)的空间,所以是行不通的。
下面是一个网友的解答:
这个问题属于stable 0-1 sorting的问题,有一篇论文:http://www.diku.dk/hjemmesider/ansatte/jyrki/Paper/KP92b.pdf
采用的一种块排序的方法 block sorting
大家有时间和兴趣研究的可以去看一下这个paper,或者有更好更简单的方法还请告知我(微博:@evagle),thanks!
题目:给你一个待排序数组,有正有负,要求在O(n)时间和O(1)空间内将数组中的负数放在整数前面,但是负数之间的顺序不变,正数间的顺序也不变(即要求是stable的排序)。例如 -1 1 3 -2 2排序后是-1 -2 1 3 2.
第一想法是quick sort 的partition方法,它可以实现O(n)的时间和O(1)的空间,但是它不是stable的,不能保证正数/负数之间的顺序不变。如果要stable貌似就很难O(n)。其他的方法例如可以修改merge sort得到stable的排序,但是它需要O(nlogn)的时间和O(n)的空间,所以是行不通的。
下面是一个网友的解答:
这个问题属于stable 0-1 sorting的问题,有一篇论文:http://www.diku.dk/hjemmesider/ansatte/jyrki/Paper/KP92b.pdf
采用的一种块排序的方法 block sorting
大家有时间和兴趣研究的可以去看一下这个paper,或者有更好更简单的方法还请告知我(微博:@evagle),thanks!
相关文章推荐
- 对1...n,数组长度未知进行交换排序(无重复值,时间复杂度O(n), 空间复杂度O(1))
- 一道排序笔试题,在o(n)时间内对一个数组进行排序
- php两个数组合并在一起,根据两个数组相同的键进行排序(时间排序)
- 要求对数组a进行排序,要求时间复杂度为O(N)
- PHP排队时间数组进行排序
- 实现一个排序算法,对0~n-1范围内的n个不重复的无序数组进行排序,时间复杂度为O(n),空间复杂度为O(1)。
- 数组(时间格式)进行排序
- int a[] = {12,13,12,13,19,18,15,12,15,16,17},要求对数组a进行排序,要求时间复杂度为O(N)
- 一个数组中只有0,1,2三个元素,进行排序,要求时间复杂度为O(n)
- php数组函数序列之krsort()- 对数组的元素键名进行降序排序,保持索引关系
- 【练习】输入一个已经按升序排序过的数组和一个数字sum,在数组中查找两个数,使得它们 的和正好是输入的那个数字sum,要求时间复杂度为O(n)
- 一道看上去很吓人的算法面试题:如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)
- jquery 读取XML 文件 并按时间进行排序
- 【华为OJ】【052-输入整型数组和排序标识,对其元素按照升序或降序进行排序】
- 三维数组进行排序
- .NET :如何对数组进行排序
- 选择排序算法---对一个数组进行选择排序
- 对n个数字进行排序,其中两两不同的数字的个数为k,n远远大于k,而n的取值区间长度超过了内存的大小,时间复杂度最小
- 给定一组不重叠的间隔,在间隔中插入一个新的间隔(如有必要,合并)。间隔最初按照起始时间进行排序。
- OBjective-C:在可变数组NSMutableArray中添加相同对象后,进行自定义的排序方式输出