负数在前,正数在后保持数据相对位置不变

7 篇文章 0 订阅

标题百度面试题(一):假设一整型数组存在若干正数和负数,现在通过某种算法使得该数组的所有负数在正数的左边,且保证负数和正数间元素相对位置不变。时空复杂度要求分别为: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;
}
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值