不改变正负数之间相对顺序重新排列数组,且要求时间复杂度O(N),空间O(1)
(2013-09-07 10:14:06)
标签:
正负数排序面试o(n) |
分类: IT笔试面试 |
原题是这样的:
一个未排序整数数组,有正负数,重新排列使负数排在正数前面,并且要求不改变原来的正负数之间相对顺序。
比如:
input: 1,7,-5,9,-12,15
,ans: -5,-12,1,7,9,15
。且要求时间复杂度O(N),空间O(1)
。
现在提供一种思路:和之前有人提到的桶排序差不多,思路如下
首先找到最大整数Max(15)和最小负数的绝对值Min(12),令M=15+12+1=28,记录整数个数positive_num和负数个数negative_num,则最终排序的结果中,负数的下标范围是[0~negative_num-1],正数的下标范围是[negative_num, negative_num+positive_num-1]。
1.将所有数字加上|min|,变为非负数,将数组中所有元素都再乘以M。
2.
计算出每个元素 “应该”
在的位置,小于|min| * M
的应该在
只要将对应位置加上 (数字/ M)。
3. 最后一遍扫描,对数据修正,只需将对应位置进行如下处理: (数字%M - |min|) 即可。
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
}

加载中…