信息学奥赛一本通1181:整数奇偶排序

时间限制: 1000 ms         内存限制: 65536 KB
提交数: 14095     通过数: 9152

【题目描述】

给定10个整数的序列,要求对其重新排序。排序要求:

1.奇数在前,偶数在后;

2.奇数按从大到小排序;

3.偶数按从小到大排序。

【输入】

输入一行,包含10个整数,彼此以一个空格分开,每个整数的范围是大于等于0,小于等于30000。

【输出】

按照要求排序后输出一行,包含排序后的10个整数,数与数之间以一个空格分开。

【输入样例】

4 7 3 13 11 12 0 47 34 98

【输出样例】

47 13 11 7 3 0 4 12 34 98

分析:很简单的题目,直接上代码,分析完题意即可开始做,也没啥需要注意的地方

#include<iostream>
#include<algorithm>
using namespace std;
int a[10],b[10];
bool cmp(int a,int b)
{
	return a>b;
}
int main()
{
	int x=0,y=0,n=10,num;
	while(n--)
	{
		cin>>num;
		if(num%2==0) b[y++]=num;
		else a[x++]=num;
	}
	sort(a,a+x,cmp);
	sort(b,b+y);
	for(int i=0;i<x;i++)
	{
		cout<<a[i]<<" ";
	}
	for(int i=0;i<y;i++)
	{
		cout<<b[i]<<" ";
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 可以使用冒泡排序的思想来实现整数排序。具体步骤如下: 1. 定义一个整型数组,存储待排序整数。 2. 使用双重循环,外层循环控制排序的轮数,内层循环控制每轮比较的次数。 3. 在内层循环中,比较相邻的两个数,如果前一个数是数,后一个数是数,则交换它们的位置。 4. 在内层循环中,比较相邻的两个数,如果前一个数和后一个数都是数,且前一个数比后一个数小,则交换它们的位置。 5. 在内层循环中,比较相邻的两个数,如果前一个数和后一个数都是数,且前一个数比后一个数大,则交换它们的位置。 6. 最后输出排序后的整数数组。 下面是具体的代码实现: ```c #include <stdio.h> void sort(int arr[], int len) { int i, j, temp; for (i = 0; i < len - 1; i++) { for (j = 0; j < len - 1 - i; j++) { if ((arr[j] % 2 == 0) && (arr[j + 1] % 2 == 1)) { // 前一个数是数,后一个数是数 temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } if ((arr[j] % 2 == 1) && (arr[j + 1] % 2 == 1)) { // 前一个数和后一个数都是数 if (arr[j] < arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } if ((arr[j] % 2 == 0) && (arr[j + 1] % 2 == 0)) { // 前一个数和后一个数都是数 if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } } int main() { int arr[] = { 3, 5, 2, 4, 1, 6 }; int len = sizeof(arr) / sizeof(arr[0]); sort(arr, len); for (int i = 0; i < len; i++) { printf("%d ", arr[i]); } printf("\n"); return 0; } ``` 输出结果为:5 3 1 2 4 6 ### 回答2: C语言整数排序是一个经典的算法,计算机编程中常会用到,主要思路是过遍历整型数组,先将所有的数按降序排列,再将所有数按升序排列,最后将两部分拼接起来即可得到所需结果。 具体实现方法如下: 1. 定义一个数组来存储要排序整数; 2. 然后分别对数和数进行排序,可以使用冒泡排序、快速排序等算法; 3. 对排序时,先遍历数组,将所有数取出来,放入一个新的数组中,然后对该数组进行降序排序; 4. 对排序时,同样遍历数组,将所有数取出来放入新数组中,然后对该数组进行升序排序; 5. 最后,将排序完成的数数组和数数组拼接在一起,即可得到所需结果。 具体实现方式如下: void sort(int array[], int len) { int i, j, tmp; //先将所有数按降序排列 for (i = 0; i < len - 1; i++) { for (j = i + 1; j < len; j++) { if (array[j] % 2 == 1 && array[i] < array[j]) { tmp = array[i]; array[i] = array[j]; array[j] = tmp; } } } //再将数按升序排列 for (i = len - 1; i > 0; i--) { for (j = 0; j < i; j++) { if (array[j] % 2 == 0 && array[j] > array[j + 1]) { tmp = array[j]; array[j] = array[j + 1]; array[j + 1] = tmp; } } } } 上述代码实现了将整数数组按照性进行排序,分别对数和排序,并且数按照降序排列,数按照升序排列。可以根据实际情况进行调整,如数按照升序排列,数按照降序排列等。 ### 回答3: 该问题可以按照如下步骤解决: 1. 首先开辟两个数组,一个用于存放数,另一个用于存放数。 2. 遍历整个数组,将数存放在数数组中,将数存放在数数组中。 3. 分别对数数组和数数组进行排序,使得数从大到小排列,数从小到大排列。 4. 将排序后的数数组和数数组合并成一个新的数组,即可得到所需的排序结果。 下面是一个c语言实现的示例代码: void sort(int arr[], int n) { int odd[n], even[n]; int oddIndex = 0, evenIndex = 0; // 将数和数分别存放到两个数组中 for (int i = 0; i < n; i++) { if (arr[i] % 2 != 0) { odd[oddIndex++] = arr[i]; } else { even[evenIndex++] = arr[i]; } } // 对数从大到小排序 for (int i = 0; i < oddIndex; i++) { for (int j = i + 1; j < oddIndex; j++) { if (odd[i] < odd[j]) { int tmp = odd[i]; odd[i] = odd[j]; odd[j] = tmp; } } } // 对数从小到大排序 for (int i = 0; i < evenIndex; i++) { for (int j = i + 1; j < evenIndex; j++) { if (even[i] > even[j]) { int tmp = even[i]; even[i] = even[j]; even[j] = tmp; } } } // 将数和数合并到一个数组中 int index = 0; for (int i = 0; i < oddIndex; i++) { arr[index++] = odd[i]; } for (int i = 0; i < evenIndex; i++) { arr[index++] = even[i]; } } 该代码中,首先将原数组中的数和数分别存放到两个数组中。然后对数数组和数数组进行排序,最后将排序后的结果合并到一个新的数组中,即可得到所需的排序结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冯耀文

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值