1. 目标
已知数组A[n]中元素为整型,设计算法将其调整为左右两部分,左边所有元素为奇数,右边所有元素为偶数。
2. 样例
输入
无
输出
1 9 3 7 5 6 8 4 2
3. 代码
//已知数组A[n]中元素为整型,设计算法将其调整为左右两部分
//左边所有元素为奇数,右边所有元素为偶数
//3 9 1 7 5 2 6 8 4
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int a[9] = { 1,2,3,4,5,6,8,7,9 };
int tmp = 0;
for (int i = 0; i < 9; i++)
{
if (a[i] % 2 == 1) continue;
//到这一步,a[i]是偶数
for (int j = i; j < 9; j++)
{
if (a[j] % 2 == 1)
{
tmp = a[i];
a[i] = a[j];
a[j] = tmp;
break;
}
}
}
for (int i = 0; i < 9; i++)
{
cout << a[i] << " ";
}
cout << endl;
return 0;
}
4. 拓展
在小节3中的代码,奇数和偶数的搜索都是从数组左端开始的,在搜索的过程中,不可避免地出现了一些重复。这增大了搜索的时间复杂度。下面我们给出从数组两端进行搜索的代码:
//已知数组A[n]中元素为整型,设计算法将其调整为左右两部分
//左边所有元素为奇数,右边所有元素为偶数
//3 9 1 7 5 2 6 8 4
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int a[9] = { 1,2,3,4,5,6,8,7,9 };
int i = 0;
int j = 8;
int tmp = 0;
while (i < j)
{
while (a[i] % 2 != 0 && i<=8) i++;
while (a[j] % 2 == 0 && j>=0) j--;
if (i < j)
{
tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
}
for (int i = 0; i < 9; i++)
{
cout << a[i] << " ";
}
cout << endl;
return 0;
}
在参考其他的代码时,笔者发现即使整型数组访问越界,vs 2017也没有报错,不知道是什么原因。接下来,计划对这方面的问题进行探究。