发布网友 发布时间:2022-04-26 15:19
共3个回答
热心网友 时间:2023-10-11 11:41
你那个程序逻辑太混乱, 所以嵌套判断的时候,把自己也给绕进去了,其实就应该是a数组,两个变量i, j,i 对应奇数,j对应偶数,i从头,j从尾相向而行, 一偶一奇时,互换位置;否则偶数i++,奇数j--(继续相向而行),代码修改如下:
void assort(int a[], const unsigned int n)
{
int i, j, t;
i = 0;
j = n-1;
while (i<j)
{
if (a[i]%2 == 0 && a[j]%2 != 0)
{
t = a[i];
a[i] = a[j];
a[j] = t;
j--;
i++;
}
else if (a[j]%2 == 0)
j--;
else if (a[i]%2 !=0)
i++;
}
}
把接口稍微修改了一下,用了const unsigned int, 以表示n是不能变的;
其实你完全可以用C的标准库函数qsort, 自己写的compare函数调整一下即可。 如下:
int compare (const void * a, const void * b)
{
if ( (*(int*)a % 2 == 0) && (*(int*)b % 2 != 0) )
return 1;
if ( (*(int*)a % 2 != 0) && (*(int*)b % 2 == 0) )
return -1;
else
return ( *(int*)a - *(int*)b );
}
测试例子:
int main(int argc, char *argv[])
{
int data[] = {10, 8, 7, 6, 5, 2, 4, 3, 1, 9};
size_t data_len;
int i;
data_len = sizeof(data)/sizeof(data[0]);
qsort (data, data_len, sizeof(int), compare);
for (i=0; i<data_len; i++)
printf ("%d ",data[i]);
return 0;
}
输出:完全奇偶分开并且升序排序的结果:
1 3 5 7 9 2 4 6 8 10
热心网友 时间:2023-10-11 11:41
#include <stdio.h>
#define N 10
void assort(int a[],int n)
{
int i=0,j=n,m,k,t;
while (i<j);
{
if(a[i]%2==0)
{
k=i; //把i++删了,在成功执行下面的if之前,i是不能变的
if(a[j]%2!=0)
{
m=j;
t=a[k];
a[k]=a[m];
a[m]=t;
j--;
i++;
}
else
j--;
}
else i++;
}
}
int main()
{
int i,a[N];
for (i=0;i<N;i++)
scanf("%d",&a[i]);
assort(a,N-1);//N是10,这个数组里是没有a[10](a[N])的
for(i=0;i<N;i++)
printf("%d ",a[i]);
return 0;
}
我也没调试,你自己调试一下吧,改动了,看的出来吧。
热心网友 时间:2023-10-11 11:42
如果是左偶数,右奇数呢