关于stable_partition的问题 财富值41

2016-10-31 14:50发布

题目:假设一整型数组存在若干正数和负数,现在通过某种算法使得该数组的所有负数在正数的左边,且保证负数和正数间元素相对位置不变。时空复杂度要求分别为:o(n)和o(1)。

大概就是要求stable_partition的实现,然而stl中stable_partition实现利用了额外的空间,不符合题目要求呢。

正常会有两种实现方法:

(一)用一个游标,从前往后遍历,第一次遇到负数则继续,遇到正数则记录并接着走,再遇到负数则与刚记录的正数互换,并将记录后移一位,这样遍历完成的时候移位也完成了。

(二)用两个游标,一个位于数组头,往后遍历,一个位于数组尾,往前遍历。前面的遇到负数后面的遇到正数组则继续;前面的遇到正数后面的遇到负数则互换,直到后面游标小于前面游标算完成。

但是都不满足稳定性的要求,毕竟快排是不稳定的排序。
那这题应该怎么做呢。再花o(n)时间,把后半部分不稳定的地方给找到再rotate??感觉好蛋疼。

4条回答

假设数组为a,
1.先找到第一个整数,记好位置为i,然后找到后面遇到的第一个负数,位置为j, 保存a[j]到临时变量里,将a[i, j-1]区间的数拷贝给a[i+1, j], 临时变量赋值给a[i],
2.位置i存放的是找到的负数
3.继续从j+1开始,找到下一个负数,位置为k, a[k]保存到临时变量, 拷贝a[i+1, k-1] 到 a[i+2, k], 临时变量赋值给a[i+1]
4.此时i+1存放的是刚找到的负数
5.继续前面的过程

一周热门 更多>