70,037
社区成员
发帖
与我相关
我的任务
分享
void OddEven(int data[],int len)
{
int i = 0;
int j = len - 1;
while(i < j)
{
while(i < j && data[j] % 2 == 0)// 从后面找奇数
j--;
while(i < j && data[i] % 2 != 0)// 从前面找偶数
i++;
int tmp = data[i];
data[i] = data[j];
data[j] = tmp;
i++;
j--;
}
}
时间复杂度不是O(n)
bool isodd(int i)
{
return i&1 == 1;
}
partition(a, a + sizeof(a)/sizeof(int), isodd);void partitionbyparity(int *begin, int *end)
{
int *odd=begin, *even=end-1;
while (odd < even)
{
while (((*odd%2) == 1) && (odd < end))
odd++;
while (((*even%2) == 0) && (even >= begin))
even--;
if (odd < even)
swap(*odd, *even);
}
}
void OddEven1(int data[],int len)
{
int i = 0;
int j = len - 1;
while(i < j)
{
if(data[i] % 2 !=0)
{
i++;
continue;
}
if(data[j] % 2 == 0)
{
j--;
continue;
}
int tmp = data[i];
data[i] = data[j];
data[j] = tmp;
}
}
时间复杂度O(n)空间复杂度O(1)
int _tmain(int argc, _TCHAR* argv[])
{
int a[10]={1,2,4,3,12,6,18,8,9,10};
int i,j,temp;
for(i=0,j=9;i<5;i++,j--)
{
if(a[i]%2!=0)
continue;
if(a[j]%2==0)
continue;
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
for(i=0;i<10;i++)
printf("%d ",a[i]);
system("pause");
return 0;
}
main()
{
int a[10] = {1,2,5,10,9,2,4,6,8,3};
int *p = a;
int i = 0;
int k = 9;
for(i = 0; i < 5; ++i)
{
if(*(p+i) % 2 != 0)
{
*(p+i) ^= a[k];
a[k] ^= *(p+i);
*(p+i) ^= a[k];
--k;
}
if(*(p+i) % 2 != 0)
{
--i;
}
}
}
从前往后找,遇到奇数就和后面的数对调位置,然后对调换到前面的数判断其是奇数还是偶数;
是奇数就继续放到后面去,是偶数就处理后面一个数。
基本思路就是这样了
void reOrder(int* arr, unsigned int n){
if(arr == 0 || n == 0) return;
int p1 = arr, p2 = arr + n - 1;
while(p1 < p2){
while(p1 < p2 && ((*p1) & 1) == 1)
p1++;
while(p1 < p2 && ((*p2) & 1) == 0)
p2--;
if(p1 < p2) swap(*p1, *p2);
}
}
如有编译错误请原谅,因为第一次在这里写代码