首先,如果不考虑相对顺序的话。。。。
可以使用两个指针 begin 和 end ,
#include <stdio.h>
#include <iostream>
using namespace std;
void lmf(int A[], int n)
{
int end, begin, temp;
end = n - 1;
begin = 0;
while (end > begin)
{
if ((A[end] & 1) && !(A[begin] & 1) )
{
swap(A[begin],A[end]);
--end;
++begin;
}
else
{
if (!(A[end] & 1))
{
--end;
}
if (A[begin] & 1)
{
++begin;
}
}
}
}
int main(void)
{
int A[] = {6, 4, 3, 8, 10, 11, 12, 9};
int i, n = 8;
lmf(A, n);
for (i = 0;i < n; i++)
{
printf("%d ", A[i]);
}
printf("\n");
return 0;
}
为了保持相对位置的不变。
先让第一个位置为奇数,之后用一个指针记录插入的位置。把每个奇数插入到前面。这样就保证相对位置不变了。
#include <stdio.h>
void lmf(int A[], int n)
{
int i, j, temp, lastOdd;
for (i = 0; i < n; i++) //找到数组中的第一个奇数放在A[0]
{
if (A[i] & 1)
{
temp = A[i];
for (j = i;j > 0; j--)
{
A[j] = A[j - 1];
}
A[0] = temp;
lastOdd = i; //之后从lastOdd + 1位置开始查找奇数
break;
}
}
for (i = lastOdd + 1, lastOdd = 0; i < n; i++)
{
if (A[i] & 1)
{
temp = A[i];
for (j = i; j > lastOdd + 1; j--) //依次向前移动
{
A[j] = A[j - 1];
}
A[++lastOdd] = temp;
}
}
}
int main(void)
{
int A[] = {6, 4, 3, 8, 10, 11, 12, 9};
int i, n = 8;
lmf(A, n);
for (i = 0;i < n; i++)
{
printf("%d ", A[i]);
}
printf("\n");
return 0;
}
同样的问题
调整一个字符串。
把字符串中的大写字母放在前面,小写字母放在后面,大写字母之间的相对顺序保持不变,小写字母也是。
//把一个字符串,的大写字母放在前面,小写字母放在后面,相对顺序保持不变。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void lmf(char *str)
{
int i, j, lastOdd;
char temp;
int n=strlen(str);
for (i = 0; i < n; i++) //找到字符串中的第一个大写字母放在最前端
{
//遇到大写字母
if (str[i] >= 'A' && str[i] <= 'Z')
{
temp = str[i];
for (j = i; j > 0; j--)
{
str[j] = str[j - 1];
}
str[0] = temp;
lastOdd = i; break;
}
}
for (i = lastOdd + 1, lastOdd = 0; i < n; i++)
{
if(str[i] >= 'A' && str[i] <= 'Z')
{
temp = str[i];
for (j = i; j > lastOdd + 1; j--){
str[j] = str[j - 1];
}
str[++lastOdd] = temp;
}
}
}
int main(void)
{
char str[]="abCDefG";
lmf(str);
puts(str);
return 0;
}