Exemple #1
0
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
}
Exemple #3
0
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;
}