一个整数数组中,使得数组中所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分。

想法:

我们首先定义一个头i,和尾j,要保证i<j,接下还是来我们我们先从头找,若是奇数那就i++,如为偶数则退出次循环,接下来在从尾找,若为偶数则j++,若为奇数则次循环退出,这时我们就找到了一对不符合条件的数字,对这对数字进行交换,然后i++,j--,接着找。

这里说明一下:判断奇偶,除了可以用a[i]%2之外,我们可以通过位运算来判断,因为一个数是奇数还是偶数是由他的最低比特位决定的,因为一个二进制的数转为十进制,除了最低比特位前面都可以提出一个共有的2,因此若最低比特位为1则为奇数,为0则为偶数

下面我们来看看程序吧

void switchData (int a[], int size)
{
	assert(a);
	assert(size > 0);
	int i = 0;
	int j = size - 1;
	while (i < j){
		while (i < j && (a[i]&1)){   //一个数是奇数还是偶数是由他的最低比特位决定的,因为前面的数都可以提出一个2,所以要想他是奇数,那么&1为真
			i++;
		}
		while (i < j &&(!(a[j]&1))){    //检测偶数,若是偶数 &1则为假,所以取反
			j--;
		}
		if (i < j)
		{
			a[i] ^= a[j];
			a[j] ^= a[i];
			a[i] ^= a[j];
			i++,j--;
		}

	}
}
int main()
{
	int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	int size = sizeof(a) / sizeof(a[0]);
	switchData (a, size);
	int i = 0;
	for (i = 0; i < size; i++){
		printf("%d ",a[i]);
	}
	system("pause");
	 return 0;
}

程序结果图:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值