int main() { int N,K; scanf("%d%d",&N,&K); int arr[N]; int i,j,index=0; for(i=0;i<N;i++)scanf("%d",&arr[i]); for(j=0;j<=K+1;j++){ swapMax(arr+j,N-j); } for(i=0;i<N;i++) printf("%d ",arr[i]); printf("\n"); return 0; }
int main(int argc, char* argv[]){ int rank, size, n, i, j, elementiXproc, toSort, partialToSort; orderedAfterSwap *m; FILE *file; float *elementi, *mieiElementi, *result; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); if(argc<2) { printf("Numero argomenti non sufficiente: %d richiesto %d", argc-1, 1); MPI_Abort(MPI_COMM_WORLD, 0); return 1; } if(rank==0) { writeFile(); file = fopen(argv[1],"rb"); if(file==NULL) { printf("Non è stato possibile aprire il file: %s", argv[1]); MPI_Abort(MPI_COMM_WORLD, 0); return 1; } fread(&n, sizeof(int), 1, file); elementiXproc = n/size; mieiElementi = malloc(sizeof(float)*elementiXproc); elementi = malloc(sizeof(float)*elementiXproc); fread(mieiElementi, sizeof(float), elementiXproc, file); for(i=1; i<size; i++){ MPI_Send (&elementiXproc, 1, MPI_INT, i, 0, MPI_COMM_WORLD); fread(elementi, sizeof(float), elementiXproc, file); MPI_Send (elementi, elementiXproc, MPI_FLOAT, i, 0, MPI_COMM_WORLD); } fclose(file); result = malloc(sizeof(float)*n); } else { MPI_Recv (&elementiXproc, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); mieiElementi = malloc(sizeof(float)*elementiXproc); MPI_Recv (mieiElementi, elementiXproc, MPI_FLOAT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); elementi = malloc(sizeof(float)*elementiXproc); } qsort(mieiElementi, elementiXproc, sizeof(float), floatcomp); toSort = 1; while(toSort>0) { partialToSort = 0; if(rank%2==0){ if(rank!=size-1){ MPI_Send (mieiElementi, elementiXproc, MPI_FLOAT, rank+1, 0, MPI_COMM_WORLD); MPI_Recv (elementi, elementiXproc, MPI_FLOAT, rank+1, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); m = swapMin(mieiElementi,elementi,elementiXproc); mieiElementi = m->mieiElementi; partialToSort += m->hadToSwap; } if(rank!=0){ MPI_Recv (elementi, elementiXproc, MPI_FLOAT, rank-1, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Send (mieiElementi, elementiXproc, MPI_FLOAT, rank-1, 0, MPI_COMM_WORLD); m = swapMax(mieiElementi,elementi,elementiXproc); mieiElementi = m->mieiElementi; partialToSort += m->hadToSwap; } } else { MPI_Recv (elementi, elementiXproc, MPI_FLOAT, rank-1, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Send (mieiElementi, elementiXproc, MPI_FLOAT, rank-1, 0, MPI_COMM_WORLD); m = swapMax(mieiElementi,elementi,elementiXproc); mieiElementi = m->mieiElementi; partialToSort += m->hadToSwap; if(rank!=size-1){ MPI_Send (mieiElementi, elementiXproc, MPI_FLOAT, rank+1, 0, MPI_COMM_WORLD); MPI_Recv (elementi, elementiXproc, MPI_FLOAT, rank+1, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); m = swapMin(mieiElementi,elementi,elementiXproc); mieiElementi = m->mieiElementi; partialToSort += m->hadToSwap; } } MPI_Reduce(&partialToSort, &toSort, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Bcast(&toSort, 1, MPI_INT, 0, MPI_COMM_WORLD); } MPI_Gather(mieiElementi, elementiXproc, MPI_FLOAT, result, elementiXproc, MPI_FLOAT, 0, MPI_COMM_WORLD); if(rank==0){ printf("[ "); for(j=0; j<n; j++) { printf("%f ", result[j]); } printf("] \n"); free(result); } free(m); free(mieiElementi); free(elementi); MPI_Finalize(); return 0; }
int main(int argc, char* argv[]){ int rank, size, n, i, j, elementiXproc, stage, length, next; orderedAfterSwap *m; char *binary; FILE *file; float *elementi, *mieiElementi, *result; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); if(argc<2) { printf("Numero argomenti non sufficiente: %d richiesto %d", argc-1, 1); MPI_Abort(MPI_COMM_WORLD, 0); return 1; } if(rank==0) { writeFile(); file = fopen(argv[1],"rb"); if(file==NULL) { printf("Non è stato possibile aprire il file: %s", argv[1]); MPI_Abort(MPI_COMM_WORLD, 0); return 1; } fread(&n, sizeof(int), 1, file); elementiXproc = n/size; mieiElementi = malloc(sizeof(float)*elementiXproc); elementi = malloc(sizeof(float)*elementiXproc); fread(mieiElementi, sizeof(float), elementiXproc, file); for(i=1; i<size; i++){ MPI_Send (&elementiXproc, 1, MPI_INT, i, 0, MPI_COMM_WORLD); fread(elementi, sizeof(float), elementiXproc, file); MPI_Send (elementi, elementiXproc, MPI_FLOAT, i, 0, MPI_COMM_WORLD); } fclose(file); result = malloc(sizeof(float)*n); } else { MPI_Recv (&elementiXproc, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); mieiElementi = malloc(sizeof(float)*elementiXproc); MPI_Recv (mieiElementi, elementiXproc, MPI_FLOAT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); elementi = malloc(sizeof(float)*elementiXproc); } qsort(mieiElementi, elementiXproc, sizeof(float), floatcomp); length = log(size)/log(2); binary = intToBinary(rank,length); for(stage=0; stage<length; stage++) { if(binary[stage]=='0'){ binary[stage] = '1'; next = binaryToInt(binary, length); binary[stage] = '0'; MPI_Send (mieiElementi, elementiXproc, MPI_FLOAT, next, 0, MPI_COMM_WORLD); MPI_Recv (elementi, elementiXproc, MPI_FLOAT, next, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); m = swapMin(mieiElementi,elementi,elementiXproc); mieiElementi = m->mieiElementi; } else { binary[stage] = '0'; next = binaryToInt(binary, length); binary[stage] = '1'; MPI_Recv (elementi, elementiXproc, MPI_FLOAT, next, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Send (mieiElementi, elementiXproc, MPI_FLOAT, next, 0, MPI_COMM_WORLD); m = swapMax(mieiElementi,elementi,elementiXproc); mieiElementi = m->mieiElementi; } } MPI_Gather(mieiElementi, elementiXproc, MPI_FLOAT, result, elementiXproc, MPI_FLOAT, 0, MPI_COMM_WORLD); if(rank==0){ printf("[ "); for(j=0; j<n; j++) { printf("%f ", result[j]); } printf("] \n"); free(result); } free(m); free(binary); free(mieiElementi); free(elementi); MPI_Finalize(); return 0; }