码迷,mamicode.com
首页 > 编程语言 > 详细

整形数组的元素分类

时间:2016-05-13 01:00:06      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:

    一个整型数组,姑且将所有元素都设置为正整数,例如{1,2,3,4,5,6,7,8,9,10}现在要求将数组中的奇数放置到数组前面部分,偶数放置到数组的后面部分,应该怎么做呢?这个小编程题并不算难,很容易能够想到思路,我的第一种思路是这样:将数组拷贝一份,遍历拷贝的数组,奇数放到原数组前面部分,从下标0开始,偶数放到原数组后面部分,从最大下标开始,代码如下:

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--;
		}
	}
}

   这是我最先想到的方法,验证能够实现所需的功能,但存在缺点:需要开辟一定的空间,如果数组很大,这对内存是否够用来说存在一定问题,效率上也存在一定问题,那么我们可以改进一下,设定一个临时变量来交换奇数和偶数,代码如下:

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;
		}
	}
}
这样一来效率似乎提高了不少。

整形数组的元素分类

标签:

原文地址:http://blog.csdn.net/korey_sparks/article/details/51348296

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!