回 帖 发 新 帖 刷新版面

主题:讲一个整数列按按奇数在前,偶数在后的顺序重新排放,并要求奇偶两部分分别有序。 C

则道题不会做,求大家帮我想想!

回复列表 (共14个回复)

沙发

可以简单地先把原始数列分成奇偶两个分别作插入排序,然后再合并,也可以直接做特定顺序的插入排序
两种不同的思路流程化伪代码分别如下:

拆分数组:
输入原始数组
穷举这个数组的每一个元素
    对于奇数,插入排序到临时数组1
    对于偶数,插入排序到临时数组2
合并两个临时数组到结果数组

不拆分数组:
输入原始数组
穷举这个数组的每一个元素
    对于奇数,插入排序到结果数组首元到第一个偶数之间的部分
    对于偶数,插入排序到结果数组最后一个奇数之后的部分

代码看起来抽象实际上如果你理解了插入排序和数组之后没有难度

板凳


我简单说一下思路吧,先将这个整数列按照奇数和偶数分别存放到两个数组中,这个很容易实现,用条件语句加循环就行,然后分别对这两个数组排序,排序的方法就很多了,自己选一个就行,最后将排好序的偶数列连接到奇数列后,这个也可以用循环做到,这就完成了

3 楼

直接调用qsort,给一个比较算法就是了

#include <stdio.h>
#include <stdlib.h>

int mycompare( const void *elem1, const void *elem2 )
{
    const int a = *(const int*)elem1;
    const int b = *(const int*)elem2;

    if( (a&1) == 1 )
    {
        if( (b&1) == 1 )
            return a-b; // a b 都是奇数
        else
            return -1; // a是奇数,b是偶数
    }
    else
    {
        if( (b&1) == 0 )
            return a-b; // a b 都是偶数
        else
            return +1; // a是偶数,b是奇数
    }
}

int main(int argc, char **argv)
{
    int test[4] = { 6, 4, 13, 21 };
    
    qsort( test, 4, sizeof(test[0]), &mycompare );
    printf( "%d %d %d %d\n", test[0], test[1], test[2], test[3] );
    return 0;
}

4 楼


思路明确,不过最后两个奇偶数组如何放入一个数组中,这有点麻烦。

5 楼

说说思路哈:先用if语句将奇数和偶数分别选出存在两个数组中
            
            再用冒泡法将两个数组排序
            
            最后将两个数组拼接在一起形成最终的数组

至于最后的拼接,可以用奇偶数组元素的个数来判断拼接的位置

6 楼

#include<stdio.h>
void main()
{
    int a[10],b[10],c[10],i,j,k,m,n;
    printf("请输入10个整数:\n");
        scanf("%d",&a[i]);
    for(i=0;i<10;i++)
        for(j=0;j<10;j++)
    {
        if(a[i]%2==0)
            for(j=0;j<10;j++)
            {
                m=a[i];
                a[i]=b[j];
                b[j]=m;
            }
    
        else
            for(k=0;k<10;k++)
            {
                n=a[i];
                a[i]=c[k];
                c[k]=n;
            }
    
        printf("%d%d",b[10],c[10]);
    }
}
我做了一下,但错了,求大家给看看!

7 楼

说实话,没看懂你的思路,加下注释可以不

8 楼

就是先把奇数和偶数分开,再分别附到两个数组中

9 楼

if(a[i]%2==0)
            for(j=0;j<10;j++)
            {
                m=a[i];
                a[i]=b[j];
                b[j]=m;
            }
    
        else
            for(k=0;k<10;k++)
            {
                n=a[i];
                a[i]=c[k];
                c[k]=n;
            }
这个数组拆分的思路有点问题
要做的是赋值而不是交换
这个问题的处理其实很简单,这么做就可以了
在前面初始化b和c的下标比如叫maxb和maxc
那么在前面声明的时候,声明int maxb=-1,maxc=-1;
这个判断就可以写成
if(a[i]%2==0)
  b[++maxb]=a[i];//最大下标+1,并且把a[i]赋给b的最后一个元素
else
  c[++maxc]=a[i];//最大下标+1,并且把a[i]赋给c的最后一个元素
试着看懂这个判断吧

10 楼


#include<stdio.h>
void main()
{
    int a[10],b[10],c[10],maxb=-1,maxc=-1,i;
    printf("请输入10个整数:\n");
        scanf("%d",&a[i]);
    for(i=0;i<10;i++)
        
    {
        if(a[i]%2==0)
          b[++maxb]=a[i];
        else
          c[++maxc]=a[i];
    }
    printf("%d%d",b[10],c[10]);
}
这样做对吗,但是做不出结果,你给看看。

我来回复

您尚未登录,请登录后再回复。点此登录或注册