奇偶简单排序

该博客介绍了一个C语言实现的算法,用于对包含10个整数的序列进行特殊排序:奇数在前且降序排列,偶数在后且升序排列。程序首先将数字分为奇数和偶数数组,然后分别对这两个数组进行排序,最后按顺序输出排序后的序列。

蒜术师给了你一个 10 个整数的序列,要求对其重新排序。排序要求:

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

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

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

输入格式

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

输出格式

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

输入

4 7 3 13 11 12 0 47 34 98

输出

47 13 11 7 3 0 4 12 34 98

解题思路

首先将数输入数组中,判读此数奇偶,奇数一个数组,偶数一个数组

并设立两个计数器分别++,之后将奇偶两数组分别按题意进行排序,之后输出奇偶数组


#include<stdio.h>
#include<math.h>
int main()
{
int a[10];
int b[10];
int c[10];
	int i,j=0,k=0,n,m,p;
	for(i=0;i<10;i++){            
		scanf("%d",&a[i]);
		if(a[i]%2!=0){
			b[j]=a[i];
			j++;
		}else if(a[i]%2==0){
			c[k]=a[i];
			k++;
		}
	}
	
	for(i=0;i<=k;i++){      
		for(p=1;p<k;p++){
			if(c[p]<c[p-1]){
				m=c[p];
				c[p]=c[p-1];
				c[p-1]=m;
			}
		}
	}			
for(i=0;i<=j;i++){       
		for(p=1;p<j;p++){
			if(b[p]>b[p-1]){
				n=b[p];
				b[p]=b[p-1];
				b[p-1]=n;
			}
		}
	}	

	for(i=0;i<j;i++){        
		printf("%d ",b[i]);
	}
	for(i=0;i<k;i++){          
		printf("%d ",c[i]);
	}
	return 0;
}

### MPI环境下实现奇偶交换排序的方法 奇偶交换排序是一种基于冒泡排序的改进算法,能够在并行环境中高效运行。在MPI环境下的实现通常依赖于消息传递接口(Message Passing Interface),用于节点之间的数据同步和通信。 以下是关于如何在MPI环境下实现奇偶交换排序的具体说明: #### 1. 基本原理 奇偶交换排序的核心思想是在每一轮迭代中交替执行奇数阶段和偶数阶段的操作。具体来说,在奇数阶段,相邻的两个元素位置分别为`i`和`i+1`,其中`i`为奇数;而在偶数阶段,则考虑`i`为偶数的情况。这种分阶段的设计使得该算法非常适合并行化[^1]。 #### 2. MPI中的实现思路 为了适应分布式内存架构,可以将待排序数组划分为若干子集,每个处理器负责一部分数据的局部排序,并通过消息传递机制与其他处理器交互以完成全局排序。整个过程致如下: - **初始化**: 将输入数组均匀分布到各个进程上。 - **本地排序**: 每个进程对其拥有的部分进行独立的奇偶排序。 - **跨进程比较与交换**: 在每次迭代结束时,相邻进程之间发送/接收边界元素以便调整顺序。 - **重复上述两步**, 直至所有元素都已按序排列为止。 #### 3. 示例代码 下面给出一段简单的C语言版MPI程序示范这一流程: ```c #include <mpi.h> #include <stdio.h> void local_odd_even_sort(int *data, int size){ // Perform Odd Even Sort on the given data array of specified size. for (int phase = 0; phase < size; ++phase) { if ((phase % 2 == 0 && phase / 2 < size - 1)) { /* even */ if(data[phase / 2]>data[(phase / 2)+1]){ int temp=data[phase / 2]; data[phase / 2]=data[(phase / 2)+1]; data[(phase / 2)+1]=temp; } }else{ /* odd */ if(phase / 2>0&&data[(phase / 2)-1]>data[phase / 2]){ int temp=data[(phase / 2)]; data[(phase / 2)]=data[(phase / 2)-1]; data[(phase / 2)-1]=temp; } } } } int main(int argc, char* argv[]) { int rank, size; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); const int N = 8*size; // Total number of elements to be sorted int sendbuf[N], recvbuf[N]; if(rank==0){ // Initialize random values into buffer only at root process srand(time(NULL)); for(int i=0;i<N;i++)sendbuf[i]=(rand()%N)+1; } // Scatter initial unsorted list across all processes MPI_Scatter(sendbuf,size,MPI_INT,&recvbuf[size],size,MPI_INT,0,MPI_COMM_WORLD); // Conduct Local Sorting within each node's subset first before exchanging boundaries between nodes during global pass phases later... local_odd_even_sort(recvbuf , size ); // Gather results back together again after finishing sorting operation completely ... MPI_Gather(&recvbuf[size],size,MPI_INT,sendbuf,N/MPI_SIZEOFINT,MPI_BYTE,0,MPI_COMM_WORLD); if(!rank){ printf("\nSorted Array:\n"); for(auto elem : sendbuf )printf("%d ",elem ); puts(""); } MPI_Finalize(); } ``` 此代码片段展示了如何利用MPI函数如 `MPI_Scatter`, `MPI_Send`, 和 `MPI_Recv` 来分割原始未排序列表并将它们散布给不同的进程中去单独处理自己的那份副本之后再重新聚集起来形成最终有序的整体序列[^4]. #### 注意事项 - 上述示例假设总共有固定数量的数据项可供排序(`const int N`)以及参与运算的工作单元数目恰好能整除这些项目总数从而简化了实际部署当中可能遇到的一些复杂情况比如剩余碎片等问题。 - 需要特别注意的是当涉及到多台机器组成的集群网络环境之下还需要额外考虑到诸如延迟时间等因素的影响可能会降低整体性能表现因此建议合理规划拓扑结构减少不必要的通讯开销提升效率.
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值