枚举排序(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
该算法的基本思想是:对每一个要排序的元素统计小于它的所有元素的个数,从而得到该元素在整个序列中的位置。其时间复杂度为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 + 1endif
endfor
3)b[k] = aendfor
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;
}