本帖最后由 mingcxx 于 2016-9-14 19:17 编辑
目前能力不足,没有好办法。只有在数组变成“左半部分奇数+右半部分偶数”之后,在下一步排序之前,对最后一个奇数和第一个偶数进行新定位,确定奇偶数的排序界限(这样就不会像原来一样出现奇偶数的排序范围区域交叉,而导致奇数走进偶数区域或偶数走进奇数区域。),加了4行,做了注释,如下:#include<iostream>
#include<algorithm>
using namespace std;
bool cmp(int &a, int &b)
{
return a>b;
}
int main()
{
int a[10];
while (cin >> a[0] >> a[1] >> a[2] >> a[3] >> a[4] >> a[5] >> a[6] >> a[7] >> a[8] >> a[9])
{
int first = 0, end = 9, temp;
while (first<end)
{
while (first<end && a[first] % 2 == 1)first++;
while (first<end && a[end] % 2 == 0)end--;
if (first<end)
{
temp = a[first];
a[first] = a[end];
a[end] = temp;
first++;
end--;
}
}
/*1*/ first = 9;
/*2*/ end = 0;
/*3*/ while (first >= 0 && a[first] % 2 == 0)first--; //找到最后一个奇数的位置
/*4*/ while (end <= 9 && a[end] % 2 == 1)end++; //找到 第一个偶数的位置
sort(a, a + first + 1, cmp);
sort(a + end, a + 10);
for (int i = 0; i<9; i++)
cout << a[i] << " ";
cout << a[9] << endl;
}
return 0;
}
|