枚举排序的MPI实现

  枚举排序(Enumeration Sort)是一种最为简单的排序算法,通常也被叫做秩排序(Rank Sort)。
    该算法的基本思想是:对每一个要排序的元素统计小于它的所有元素的个数,从而得到该元素在整个序列中的位置。其时间复杂度为o(n^2)。其伪代码为:
    输入为:a[1], a[2] , ... , a[n]
    输出为:b[1], b[2] , ..., b[n]
    for i =1 to n do
         1)k =1

         2)for j = 1 to n do

           if a > a[j] then

           k= k + 1 

           endif 

           endfor

                   3)b[k] = a

     endfor

MPI实现要求:假设对一个长为n的输入序列,使用m个处理器进行排序,只需是每个处理器负责n/m个数组元素的定位,然后将所有定位信息集中到主进程中,由主进程负责完成所有元素的最终排位


源代码实现如下:

#include<stdio.h>
#include<stdlib.h>
#include<mpi.h>

int CountRank(int *data,int DataSize,int MyLength,int *rank,int SumID,int MyID)
{
	int i,j;
	int start,end;
	start = DataSize/SumID*MyID;
	end = start+MyLength;
	
	for (j=start;j<end;j++){
		rank[j-start]=0;
		for (i=0;i<DataSize;i++){
			if((data[j]>data[i])||(data[j]==data[i]&&j>i))
				rank[j-start]++;
		}
	}
	return 1;
}
int  GetDataSize()
{
	int i;
	while(1){
		printf("Input the Data Size");
		scanf("%d",&i);
	}
	return i;
	
}
int main(int argc,char *argv[])
{
	int DataSize,MyLength;
	int *data_in,*data_out;
	int *rank;
	int MyID,SumID;
	int i,j;
	
	MPI_Status status;
	MPI_Init(&argc,&argv);
	MPI_Comm_rank(MPI_COMM_WORLD,&MyID);
	MPI_Comm_size(MPU_COMM_WORLD,&SumID);
	
	if(MyID == 0)
		DataSize = GetDataSize();
	
	MPI_Bcast(&DataSize,1,MPI_INT,0,MPI_COMM_WORLD);
	
	MyLength = DataSize/SumID;
	if(MyID == SumID-1)
		MyLength = DataSize - MyLength*(SumID-1);
	data_in = (int*)malloc(DataSize*sizeof(int));
	if(MyID == 0){
		data_out = (int*)malloc(DataSize*sizeof(int));
		rank = (int*)malloc(DataSize*sizeof(int));
	}
	else{
		rank = (int*)malloc(MyLength*sizeof(int));
	}
	
	if (MyID==0){
		int seed;
		printf("Please input seed:");
		scanf("%d",&seed);
		printf("Random Numbers:\n");
		for(i=0;i<DataSize;i++){
			data_in[i] = ((int)rand())%10000;
			printf("%10d",data_in[i]);
		}
		printf("\nOutput:");
		printf("\n");
	}
	
	MPI_Bcast(data_in,DataSize,MPI_INT,0,MPI_COMM_WORLD);
	
	CountRank(data_in,DataSize,MyLength,rank,SumID,MyID);
	
	if (MyID == 0){
		for(i=1;i<SumID;i++){
			if(i==SumID-1)
				MPI_Recv(rank+Mylength*i,DataSize-MyLength,MPI_INT,i,0,MPI_COMM_WORLD);
			else
				MPI_Recv(rank+Mylength*i,MyLength,MPI_INT,i,0,MPI_COMM_WORLD);
		}
	}
	else 
		MPI_Send(rank,MyLength,MPI_INT,0,0,MPI_COMM_WORLD);
	
	if(MyID == 0){
		for(i=0;i<DataSize;i++)
			data_out[rank[i]] = data_int[i];
		for(i=0;i<DataSize;i++)
			printf("%10d",data_out[i]);
		printf("\n");
	}
	MPI_Finalize();
		return 1;
	
}





  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值