整形数组的奇偶元素分类

一个整型元素,姑且将所有元素都设置为整数,例如{1,2,3,4,5,6,7,8,9},现在要求将数组中的奇数放到数组前面部分,将偶数放到后面部分,该怎么做呢,这个小编程题不算难,很容易可以想到思路,我最开始的思路是这样的:将数组拷贝一份,遍历拷贝的数组,奇数就放到数组前面部分,从下标0开始,偶数就放到数组后面部分,从最大下标开始,代码如下:
</pre><p></p><pre code_snippet_id="1676180" snippet_file_name="blog_20160603_2_6201447" name="code" class="cpp">void sort(int *arr, int sz)
{
	int *arr2=(int *)malloc(sz*sizeof(int));          //定义一个数组存放原有的数组元素
	int count1 = 0;                                       
	int count2 = sz-1;
	assert(arr); 
	memcpy(arr2, arr, sizeof(int)*sz);
	for (int j = 0; j < sz; j++)                       //遍历数组
	{
		if (arr2[j] % 2 == 1)
		{
			arr[count1] = arr2[j];
			count1++;
		}
		else if (arr2[j] % 2 == 0)
		{
			arr[count2] = arr2[j];
			count2--;
		}
	}
	free(arr2);
	arr2 = NULL;
}

这是我最先想到的方法,验证能够实现所需的功能,但存在缺点:需要开辟一定的空间,如果数组很大,这对内存是否够用来说存在一定问题,效率上也存在一定问题,那么我们可以改进一下,设定一个临时变量来交换奇数和偶数,代码如下:
void sort(int *arr, int sz)
{
	int a = 0;
	int count = sz-1;
	assert(arr);
	for (int i = 0; i < sz; i++)
	{
		if (arr[i] % 2 == 1)                    //当前下标所指数为奇数,不做处理,进行下一次循环
		{
			;
		}
		else if (arr[i] % 2 == 0)              //当前下标所指数为偶数,将其与count下标所指元素进行交换,下标做一定处理
		{
			a = arr[count];
			arr[count] = arr[i];
			arr[i] = a;
			count--;
			i--;
		}
		if ((i+1) == count)                     //每一个元素都进行了判断,跳出循环
		{
			break;
		}
	}
}

 
    这样的代码解决了内存的问题,但效率上似乎还是一样的,可以进一步优化,设定两个整形指针分别指向数组的第一个元素和最后一个元素,姑且称为左指针和右指针,若左指针所指的元素为奇数,那么指针后移,直到指针指向一个偶数停下,若右指针所指元素为偶数,那么指针前移,直到找到一个奇数,如果此时左指针小于有指针,那么让两个指针所指内容交换,循环起来直到两个指针相遇,就达到了我们想要的结果。代码如下: 
 
void sort(int *arr, int sz)                //指向数组的指针和数组大小
{
	int *left = &arr[0];              //左指针
	int *right = &arr[sz - 1];        //右指针
  assert(arr);
	while (left < right)
	{
		while ((*left )% 2 == 1)   
		{
			left++;
		}
		while ((*right) % 2 == 0)
		{
			right--;
		}
		if (left < right)
		{
			int tmp = *left;
			*left = *right;
			*right = tmp;
		}
	}
}
这样一来效率似乎提高了不少。


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值