如何编程实现:数组奇数在前面 偶数在后面
答案:3 悬赏:50
解决时间 2021-02-15 23:09
- 提问者网友:美人如花
- 2021-02-15 09:55
如何编程实现:数组奇数在前面 偶数在后面
最佳答案
- 二级知识专家网友:萌萌哒小可爱
- 2021-02-15 11:19
bool isSwap(int a,int b) // 是否要交换
{
if (a %2==0 || b%2 !=0)
return(true); // 前偶,后奇,要交换
if (a %2!=0 || b%2 ==0)
return(false); // 前奇,后偶,不交换
return (a>b); // 同奇同偶,前大后小,要交换
}
void swap(int * a,int * b) // 交换 *a,*b
{
int t=*a;
*a=*b;
*b=t;
}
void oddSort(int d[],int n) // 特殊冒泡排序 ,奇数优先在前
{ int i,j;
for ( i=0;i<n-1;i++)
for ( j=i+1,j<n;j++)
if (isSwap(d[i],d[j])) // 符合交换
swap(&d[i],&d[j]); // 交换
}
程序中再调用一个上面的子程序就OK了,很短很清晰
{
if (a %2==0 || b%2 !=0)
return(true); // 前偶,后奇,要交换
if (a %2!=0 || b%2 ==0)
return(false); // 前奇,后偶,不交换
return (a>b); // 同奇同偶,前大后小,要交换
}
void swap(int * a,int * b) // 交换 *a,*b
{
int t=*a;
*a=*b;
*b=t;
}
void oddSort(int d[],int n) // 特殊冒泡排序 ,奇数优先在前
{ int i,j;
for ( i=0;i<n-1;i++)
for ( j=i+1,j<n;j++)
if (isSwap(d[i],d[j])) // 符合交换
swap(&d[i],&d[j]); // 交换
}
程序中再调用一个上面的子程序就OK了,很短很清晰
全部回答
- 1楼网友:我颠覆世界
- 2021-02-15 14:07
你那个程序逻辑太混乱, 所以嵌套判断的时候,把自己也给绕进去了,其实就应该是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
- 2楼网友:一个很哇塞的汉子
- 2021-02-15 12:57
你的输出有问题,数组的输出应该用for循环
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯