标题百度面试题(一):假设一整型数组存在若干正数和负数,现在通过某种算法使得该数组的所有负数在正数的左边,且保证负数和正数间元素相对位置不变。时空复杂度要求分别为:o(n)和o(1)。
意思就是,给一个整形数组,如:1, 7, 5, 9, -12, 15,处理后使得负数在前正数在后,且负数相对顺序不变,正数亦然。即最终得到: -12, 1, 7,5, 9, 15
思路:开始p1p2均指针指向数组头部,从数组头部开始开始判断,负数只进行p1++操作,一旦发现p1指向数据为正数,temp=*p1,则p2向后移动寻找第一个负数并进行 *p1=*p2赋值操作,p1+1到p2-1的数据整体右移一位,然后*(p1+1)=temp;此后反复进行上述操作即可。(比如第一个数据1为正数,把1放在临时变量temp,则从1后选取第一个负数-12,并把1位置赋值为-12,然后7 5 9整体数据后移一位,然后空出第二位赋值为1)
废话不多说了贴码:
#include<stdio.h>
#include<malloc.h>
void swap(int *a, int n) {
int i, t, j, temp, flag,sign=0;
for (i = 0; i < n; i++) {
if (a[i] > 0) {//一旦发现当前数据是正数则接下来进行向后寻找负数交换操作
temp = a[i];//记录当前正数
for (t = i; t < n; t++) {//向后寻找第一个遇到负数
if (a[t] < 0) {
a[i] = a[t];//找到后赋值给要前面的负数
flag = t;//记录此时这个正数的位置
sign = 1;//sign标识为1
break;
}
}
//接下来是为了保持数据相对位置不变
if (sign == 1) {//标识为1,则把负数之后,flag以前数据整体右移一位
for (j = flag; j > i + 1; j--) {
a[j] = a[j - 1];
}
a[j] = temp;//正数后移一位
sign = 0;
}
}
}
}
int main() {
int n,i;
scanf("%d",&n);
int *a=(int*)malloc(n*sizeof(int));
for(i=0; i<n; i++)
scanf("%d",a+i);
swap(a,n);
for(i=0; i<n; i++)
printf("%d ",a[i]);
return 0;
}