主题:讲一个整数列按按奇数在前,偶数在后的顺序重新排放,并要求奇偶两部分分别有序。 C
liyanjun
[专家分:0] 发布于 2010-05-11 20:34:00
则道题不会做,求大家帮我想想!
回复列表 (共14个回复)
沙发
雪光风剑 [专家分:27190] 发布于 2010-05-11 21:16:00
可以简单地先把原始数列分成奇偶两个分别作插入排序,然后再合并,也可以直接做特定顺序的插入排序
两种不同的思路流程化伪代码分别如下:
拆分数组:
输入原始数组
穷举这个数组的每一个元素
对于奇数,插入排序到临时数组1
对于偶数,插入排序到临时数组2
合并两个临时数组到结果数组
不拆分数组:
输入原始数组
穷举这个数组的每一个元素
对于奇数,插入排序到结果数组首元到第一个偶数之间的部分
对于偶数,插入排序到结果数组最后一个奇数之后的部分
代码看起来抽象实际上如果你理解了插入排序和数组之后没有难度
板凳
土豆土豆 [专家分:70] 发布于 2010-05-11 21:22:00
我简单说一下思路吧,先将这个整数列按照奇数和偶数分别存放到两个数组中,这个很容易实现,用条件语句加循环就行,然后分别对这两个数组排序,排序的方法就很多了,自己选一个就行,最后将排好序的偶数列连接到奇数列后,这个也可以用循环做到,这就完成了
3 楼
bruceteen [专家分:42660] 发布于 2010-05-11 22:26:00
直接调用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 楼
liyanjun [专家分:0] 发布于 2010-05-12 12:36:00
思路明确,不过最后两个奇偶数组如何放入一个数组中,这有点麻烦。
5 楼
NTFNTF123 [专家分:100] 发布于 2010-05-12 15:05:00
说说思路哈:先用if语句将奇数和偶数分别选出存在两个数组中
再用冒泡法将两个数组排序
最后将两个数组拼接在一起形成最终的数组
至于最后的拼接,可以用奇偶数组元素的个数来判断拼接的位置
6 楼
liyanjun [专家分:0] 发布于 2010-05-12 20:07:00
#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 楼
雪光风剑 [专家分:27190] 发布于 2010-05-12 20:17:00
说实话,没看懂你的思路,加下注释可以不
8 楼
liyanjun [专家分:0] 发布于 2010-05-12 20:35:00
就是先把奇数和偶数分开,再分别附到两个数组中
9 楼
雪光风剑 [专家分:27190] 发布于 2010-05-12 20:43:00
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 楼
liyanjun [专家分:0] 发布于 2010-05-12 21:05:00
#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]);
}
这样做对吗,但是做不出结果,你给看看。
我来回复