自学内容网 自学内容网

调整奇数偶数顺序

 题目:

输入一个整数数组,实现一个函数,

来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,

所有偶数位于数组的后半部分。

思路一:

可以重新开辟一个数组,然后将原有的数组遍历,先把奇数拷贝到新的数组,然后再把偶数拷贝。

源码:

int main()
{
int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
int cnt = 0;
int arr2[10] = { 0 };
for (int i=0;i<10;i++)
{
if (arr1[i] % 2 == 0)
arr2[cnt++] = arr1[i];
}
for (int i=0;i<10;i++)
{
if (arr1[i] % 2 != 0)
arr2[cnt++] = arr1[i];
}
for (int i=0;i<10;i++)
{
printf("%d ", arr2[i]);
}
return 0;
}

运行结果:

思路二:

1. 给定两个下标left和right,left放在数组的起始位置,right放在数组中最后一个元素的位置
2. 循环进行一下操作
 a. 如果left和right表示的区间[left, right]有效,进行b,否则结束循环
 b. left从前往后找,找到一个偶数后停止
 c. right从后往前找,找到一个奇数后停止
 d. 如果left和right都找到了对应的数据,则交换。

相比思路一,空间复杂度降低了不少(因为不用再创建一个新的数组)

源码:

int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int left = 0;
int right = sizeof(arr) / sizeof(arr[0])-1;
int i = 0;
int j = 0;
while (left <= right)
{
for (i=0;i<10;i++)
{
if (arr[i] % 2 == 0)
{
left = i;
break;
}
}
for (j=right;j>0;j--)
{
if (arr[j] % 2 != 0)
{
right = j;
break;
}
}
if (left <= right)
{
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
for (i=0;i<10;i++)
{
printf("%d ", arr[i]);
}
return 0;
}

 运行结果:


原文地址:https://blog.csdn.net/hanwangyyds/article/details/140911838

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!