一个整型元素,姑且将所有元素都设置为整数,例如{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;
}
}
}
这样一来效率似乎提高了不少。