问题描述:
给定N个不同的整数,要求对这N个整数按如下规则排序并输出。
规则一:所有的偶数排在奇数前面。
规则二:在规则一的前提下按照从大到小的顺序排序。
输入说明
数据由两行构成,第一行为整数n(n<=100),
表示待排序整数的数量。第二行是n个整数,
每个整数的取值区间都为[-32768~32767],
整数之间以空格间隔。
输出说明
在一行输出排好序的整数,整数之间以空格间隔。
输入样例
5
1 2 3 4 5
输出样例
4 2 5 3 1
注:起泡排序用的计数器,与指示变量效果相同
#include<stdio.h>
int main()
{
int n,a[150],j = 0,b[150];
int d,c,count_1 = 0,count_2 = 0;
scanf("%d",&n);
for(int i = 0 ; i < n ; i ++){
scanf("%d",&a[i]);
if(a[i] % 2 == 0){
b[j] = a[i];
j++;
}
}
//输入a数列,用b数列并记录a中的偶数
d = j;
//用d记录偶数的个数
for(int i = 0 ; i < n ; i++){
if(a[i] % 2 == 1){
b[j] = a[i];
j++;
}
}
//用b数列记录a中的奇数
//做到偶数在前,奇数在后
while(d != 0 && count_1 != d-1){
count_1 = 0;
for(int k = 1 ; k < d ;k++){
if(b[k-1]<b[k]){
c = b[k];
b[k] = b[k-1];
b[k-1] = c;
}else{
count_1++;
}
}
}
//起泡排序,把b数列中偶数从大到小排列
while(j - d != 0 && count_2 != j - d - 1){
count_2 = 0;
for(int k = d + 1 ; k < j ;k++){
if(b[k-1]<b[k]){
c = b[k];
b[k] = b[k-1];
b[k-1] = c;
}else{
count_2++;
}
}
}
//起泡排序,把b数列中奇数从大到小排列
for(int i = 0 ; i < j ; i++){
printf("%d ",b[i]);
}
//输出排列好的b数列
return 0;
}