蒜术师给了你一个 1010 个整数的序列,要求对其重新排序。排序要求:
-
奇数在前,偶数在后;
-
奇数按从大到小排序;
-
偶数按从小到大排序。
输入格式
输入一行,包含 1010 个整数,彼此以一个空格分开,每个整数的范围是大于等于 00,小于等于 100100。
输出格式
按照要求排序后输出一行,包含排序后的 1010 个整数,数与数之间以一个空格分开。
Sample Input
4 7 3 13 11 12 0 47 34 98
Sample Output
47 13 11 7 3 0 4 12 34 98
此题有两个难点:
1、奇数在前,偶数在后,奇偶数需要进行分类。
2、奇数和偶数有分别需要从大到小和从小到大进行排序。
那么如何实现。
这里我采用冒泡排序的思想,经过不断地遍历数组来同时完成奇数偶数分类,以及奇数偶数排序的工作。
说到冒泡排序,那么在这里就简单介绍一下吧。
冒泡排序的基本思想是:每次比较两个相邻的元素,如果它们的顺序错
误就把他们交换过来。
例如我们现在要将12 35 99 18 76这五个数进行从大到小的排序。
首先比较第1位和第2位的大小,发现12 比 35要小,因为我们希望越小的数越在后头,所以我们交
换它们的位置,交换之后五个数的顺序就是35 12 99 18 76。
按照刚才的方法继续比较第2位和第3位的大小,第2位是12,第3位是99。12 比 99要小,因此需
要交换这两个数的位置。交换之后五个数的顺序是35 99 12 18 76。
接下来就是按照这样的方法进行比较,知道比较到第4位和第5位。
4次比较之后5个数的顺序是35 99 18 76 12 。
经过4次比较你会发现最小的一位数已经就位了,但这并不是我们想要的结果,我们想要的是让五
个数从大到小排序,那么应该怎么办。
接下来按照刚才的方法从第一位继续进行比较。
五个数只要比较四次就可以让他们按照顺序进行排列。
这就如同是一个气泡,一步一步向后“翻滚”,直到最后一位。所以这种方法有一个好听的名字叫“冒
泡排序”。
“冒泡排序”的原理是:每一趟只能将一个数归位。
同样的如果是将奇数偶数进行分类,冒泡排序的思想也依然可以使用。
那么接下来只需要用冒泡排序的思想将奇数偶数的分类以及排序同时进行就可以了。
for(i=0;i<n-1;i++)
{
for(j=0;j<n-1;j++)
{
if(a[j] % 2 == 0 && a[j+1] % 2 != 0 || a[j] % 2 != 0 && a[j+1] % 2 != 0 && a[j] < a[j+1] || a[j] % 2 == 0 && a[j+1] % 2 ==0 && a[j] > a[j+1])
{
tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
}
}
}
a[j] % 2 == 0 && a[j+1] % 2 != 0
这是偶数在前,奇数在后的情况 ,用冒泡排序将奇数排在前面。
a[j] % 2 != 0 && a[j+1] % 2 != 0 && a[j] < a[j+1]
这是两个数都是奇数然后进行排序的情况
a[j] % 2 == 0 && a[j+1] % 2 ==0 && a[j] > a[j+1]
这是两个数都是偶数然后进行排序的情况。
最后,总代码如下:
#include <stdio.h>
int main()
{
int n=10,i,j,tmp;
int a[10];
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n-1;i++)
{
for(j=0;j<n-1;j++)
{
if(a[j] % 2 == 0 && a[j+1] % 2 != 0 || a[j] % 2 != 0 && a[j+1] % 2 != 0 && a[j] < a[j+1] || a[j] % 2 == 0 && a[j+1] % 2 ==0 && a[j] > a[j+1])
{
tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
}
}
}
for(i=0;i<n;i++)
{
printf("%d ",a[i]);
}
return 0;
}