void MERGESORT(int A[], int p, int r) { int q = 0; if (p < r) { q = (p + r) / 2; MERGESORT(A, p, q); MERGESORT(A, q + 1, r); MERGE(A, p, q, r); } }
//função mergesort void MERGESORT(int *A,int e, int d){ int m; int *B;//veotr auxiliar int i; int j; int k; int inverso; B = (int*) malloc((d+1)* sizeof(int)); if(d > e ){ m = (e + d)/2;//calculando o meio do vetor MERGESORT(A,e,m);//metade esquerda MERGESORT(A,m+1,d);//metade direita //intercalando for(i = e; i <= m; i++) B[i] = A[i]; for(j = m+1;j <= d;j++){ inverso = d + m + 1 - j ; B[inverso] = A[j];//preenchendo inversamente } i = e;//inicio do vetor j = d;//fim do vetor for(k = e; k <= d;k++){ if(B[i] < B[j]){ A[k] = B[i]; i++; }else{ A[k] = B[j]; j--; } } } free(B);//liberando B }
int main(void) { int arr[] = {5, 2, 4, 7, 1, 3, 2, 6}; int len = 8; int i = 0; MERGESORT(arr, 0, len - 1); printf("\n"); for (i = 0; i < len; i++) { printf("%d ", arr[i]); } printf("\n"); return 0; }
int main(){ int *A, *B;// B eh o vetor local e A o original int N, N_local, tam;//quantidade de numeros a serem ordenados int i, *aux; float start, finish; //variaveis timer int my_rank, comm_sz; // variaveis MPI MPI_Status status; //Start MPI MPI_Init(NULL,NULL); MPI_Comm_size(MPI_COMM_WORLD, &comm_sz); MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); //Caso seja o processo 0 lê a quantidade de numeros e os valores if(my_rank == 0){ scanf("%d",&N); //calcula o tamanho do vetor para cada processo para alocar memoria suficiente N_local = N/comm_sz; if (N%comm_sz) N_local++; //alocando memoria para o vetor de valores A = (int*) malloc(sizeof(int) * (N_local*comm_sz)); //lendo os valores for(i = 0; i < N; i++){ scanf("%d",&A[i]); } //preenchedo o final com -1, caso necessario for (i = N; i < N_local*comm_sz; i++){ A[i] = -1; } } //marca o tempo de inicio GET_TIME(start); // envia por broadcast o tamanho do vetor MPI_Bcast(&N, 1, MPI_INT, 0, MPI_COMM_WORLD); //calcula o tamanho do vetor para cada processo N_local = N/comm_sz; if (N%comm_sz) N_local++; //Alocando o vetor local B = (int*) malloc(sizeof(int) * (N_local)); MPI_Scatter(A, N_local, MPI_INT, B, N_local, MPI_INT, 0, MPI_COMM_WORLD); MERGESORT(B,0,N_local-1); /*printf("processo- %d - tam: %d\n", my_rank, N_local); for (i = 0; i < N_local; i++){ printf("%d ",B[i]); } */ //Junta os vetores locais for(i = 1; i < comm_sz; i = 2 * i){ if (my_rank % (2 * i) != 0) { // quando não for multiplo de 2*i envia para o rank-i e sai MPI_Send(B, N_local, MPI_INT, my_rank-i, 0, MPI_COMM_WORLD); break; } // quando for multiplo junta com rank + i (se existir) if (my_rank + i < comm_sz) { // calcula o tamanho a ser recebido tam = N_local * i; // receive other chunk aux = (int *)malloc(tam * sizeof(int)); //printf("\nReceive TAM %d\n",tam ); MPI_Recv(aux, tam, MPI_INT, my_rank + i, 0, MPI_COMM_WORLD, &status); // merge and free memory A = merge(B, N_local, aux, tam); //free(B); free(aux); B = A; N_local = N_local + tam; } } if(my_rank == 0){ GET_TIME(finish); printf("Ordenado: "); N_local = N/comm_sz; if (N%comm_sz) N_local++; printf("%d\n", N_local); for(i = 0; i < N; i++){ if(B[i] != -1 && B[i] != 0){ printf("%d ",B[i]); }else{ N++; } } printf("\n"); //marca o tempo de fim printf("tempo de execucao: %f\n", finish - start); free(A);//liberando A } MPI_Finalize(); //finalizando MPI return 0; }